洛谷P1072 Hankson的趣味题

洛谷P1072 Hankson的趣味题

题目

题目描述

原题
Hanks博士是 BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson。现在,刚刚放学回家的Hankson正在思考一个有趣的问题。
今天在课堂上,老师讲解了如何求两个正整数c1c_1c1​和c2c_2c2​的最大公约数和最小公倍数。现在Hankson认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1a_0,a_1,b_0,b_1a0​,a1​,b0​,b1​,设某未知正整数xxx满足:
1.xxx和 a0a_0a0​的最大公约数是a1a_1a1​​;
2.xxx和b0b_0b0​的最小公倍数是b1b_1b1​。
Hankson的“逆问题”就是求出满足条件的正整数xxx。但稍加思索之后,他发现这样的xxx并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的xxx的个数。请你帮助他编程求解这个问题。

输入输出格式

输入格式

第一行为一个正整数nnn,表示有nnn组输入数据。接下来的nnn行每行一组输入数据,为四个正整数 a0,a1,b0,b1a_0,a_1,b_0,b_1a0​,a1​,b0​,b1​​,每两个整数之间用一个空格隔开。输入数据保证a0a_0a0​能被a1a_1a1​整除,b1b_1b1​能被b0b_0b0​​整除。

输出格式

nnn行。每组输入数据的输出结果占一行,为一个整数。
对于每组数据:若不存在这样的xxx,请输出000;
若存在这样的xxx,请输出满足条件的xxx的个数;

输入输出样例

输入样例

2
41 1 96 288
95 1 37 1776

输出样例

6
2

题解

因为xxx是b1b_1b1​的约数,所以xxx的质因子一定也是b1b_1b1​的质因子,所以我对于b1b_1b1​的每个质因子ppp,我们可以计算xxx中有多少个ppp
假设a0,a1,b0,b1,xa_0,a_1,b_0,b_1,xa0​,a1​,b0​,b1​,x中分别有ma0,ma1,mb0,mb1,mxm_{a_0},m_{a_1},m_{b_0},m_{b_1},m_xma0​​,ma1​​,mb0​​,mb1​​,mx​个质因子ppp
由于gcd(a0,x)=b0gcd(a_0,x)=b_0gcd(a0​,x)=b0​,所以有333种情况:

  1. ma0>mb0m_{a_0}>m_{b_0}ma0​​>mb0​​,则mx=mb0m_x=m_{b_0}mx​=mb0​​
  2. ma0=mb0m_{a_0}=m_{b_0}ma0​​=mb0​​,则mxmb0m_x\geqslant m_{b_0}mx​⩾mb0​​
  3. ma0&lt;mb0m_{a_0}&lt;m_{b_0}ma0​​<mb0​​,则mxm_xmx​无解

同理,由于lcm(a1,x)=b1lcm(a_1,x)=b_1lcm(a1​,x)=b1​,所以有333种情况:

  1. ma1&lt;mb1m_{a_1}&lt;m_{b_1}ma1​​<mb1​​,则mx=mb1m_x=m_{b_1}mx​=mb1​​
  2. ma1=mb1m_{a_1}=m_{b_1}ma1​​=mb1​​,则mxmb1m_x\leqslant m_{b_1}mx​⩽mb1​​
  3. ma1&gt;mb1m_{a_1}&gt;m_{b_1}ma1​​>mb1​​,则mxm_xmx​无解

综合以上所有情况,我们可以得出共有555种情况:

  1. ma0&gt;mb0,ma1&lt;mb1,mb0=mb1m_{a_0}&gt;m_{b_0},m_{a_1}&lt;m_{b_1},m_{b_0}=m_{b_1}ma0​​>mb0​​,ma1​​<mb1​​,mb0​​=mb1​​,则mx=mb0=mb1m_x=m_{b_0}=m_{b_1}mx​=mb0​​=mb1​​
  2. ma0&gt;mb0,ma1=mb1,mb0mb1m_{a_0}&gt;m_{b_0},m_{a_1}=m_{b_1},m_{b_0}\leqslant m_{b_1}ma0​​>mb0​​,ma1​​=mb1​​,mb0​​⩽mb1​​,则mx=mb0m_x=m_{b_0}mx​=mb0​​
  3. ma0=mb0,ma1&lt;mb1,mb0mb1m_{a_0}=m_{b_0},m_{a_1}&lt;m_{b_1},m_{b_0}\leqslant m_{b_1}ma0​​=mb0​​,ma1​​<mb1​​,mb0​​⩽mb1​​,则mx=mb1m_x=m_{b_1}mx​=mb1​​
  4. ma0=mb0,ma1=mb1,mb0mb1m_{a_0}=m_{b_0},m_{a_1}=m_{b_1},m_{b_0}\leqslant m_{b_1}ma0​​=mb0​​,ma1​​=mb1​​,mb0​​⩽mb1​​,则mb0mxmb1m_{b_0}\leqslant m_x\leqslant m_{b_1}mb0​​⩽mx​⩽mb1​​
  5. 若其他情况,则mxm_xmx​均无解

我们将mxm_xmx​的取法记为sumpsum_psump​,则xxx的数量为质数pdsump\prod\limits_{\text{质数}p|d}sum_p质数p∣d∏​sump​
代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n,a0,a1,b0,b1,ans;
int gcd(int a,int b)
{
  return b==0?a:gcd(b,a%b);
}
long long lcm(int a,int b)
{
  return (long long)a*b/gcd(a,b);
}
int main()
{
  cin>>n;
  while(n--){
    ans=0;
    scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
    for(int i=1;i<=sqrt(b1);i++)
    if(b1%i==0){
  		if(gcd(i,a0)==a1&&lcm(i,b0)==b1) ans++;
      if(i*i!=b1) if(gcd(b1/i,a0)==a1&&lcm(b1/i,b0)==b1) ans++;;
    }
    printf("%d\n",ans);
  }
}
上一篇:洛谷P1072 Hankson 的趣味题


下一篇:MCP4725使用笔记