Given x and y (2 <= x <= 100,000, 2 <= y <= 1,000,000), you are to count the number of p and q such that:
1) p and q are positive integers;
2) GCD(p, q) = x;
3) LCM(p, q) = y.
Input
x and y, one line for each test.
Output
Number of pairs of p and q.
Sample Input
3 60
Sample Output
4
分析:数论+枚举。设 p=ax, q=bx;由于GCD(p, q)=x 即:GCD(ax, bx)=x;可以推出,GCD(a, b)=1;又因为p*q/x=y;所以完全可以利用这两个条件,进行枚举。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
int gcd(int a, int b)
{
return b==0 ? a : gcd(b, a%b);
}
int main()
{
#ifdef test
freopen("sample.txt", "r", stdin);
#endif
int x, y;
while(scanf("%d%d", &x, &y) != EOF)
{
if(y%x)
{
printf("0\n");
continue;
}
int n = y/x, cct=0;
double num = sqrt(n)+0.5;
for(int i=1; i<num; i++)
if(!(n%i) && gcd(i, n/i)==1)
++cct;
cct *= 2;//p,q可交换,因此需要乘以2
if(x==y)
printf("%d\n", cct-1);
else
printf("%d\n", cct);
}
return 0;
}