题目来源:http://wikioi.com/problem/1012/
大意:
求满足gcd(max)(x,y)=x0,lcm(x,y)=y0 的x,y的对数。
基础知识:
两个数的最小公倍数等于两数之积除以最大公约数。
当两个数互质,他们的lcm(min)等于两数之积。
当不互质(即存在公约数),两数的乘积等于他们各自除以gcd(max)后的乘积再乘上两个gcd(max);
而他们各自除以gcd(max)后的乘积再乘上一个gcd(max)正是lcm(min)。
所以,两个数的最小公倍数等于两数之积除以最大公约数。
思路:
1、简单枚举:
从x0枚举到y0,如果符合题意那么累加答案。
2、y/x然后分解质因数然后2的次幂就是答案。
两个数除掉gcd(max)后,剩下的数的质因数一定存在于分解出的质因数中。
那么,由于去掉gcd(max)后的部分不能再有gcd,所以每个质因数只能被一个数取,这样,盯住其中一个数就可以了,对于这一个数,有2^(质因数)种取法。
因此,算出这个数即可。
代码:
1.、
#include<iostream>
#include<cmath>
using namespace std;
int gcd(int e,int f)
{
if (f%e==0)return e;
else gcd(f%e,e);
}
int main()
{
int x0,y0,s=0,a,i,j;
cin>>x0>>y0;
for (i=x0;i<=y0;i++)
{
for (j=i+1;j<=y0;j++)
{
int g=0;
g=gcd(i,j);
if ((g==x0)&&(i*j/g==y0))
s+=1;
}
}
cout<<s*2;
return 0;
}
2、
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
bool zhi(int i)
{
for (int ii=2;ii<=sqrt(i);ii++)
if (i%ii==0) return false;
return true;
}
int main()
{
int a,b;
cin>>a>>b;
if (b%a!=0)
{
cout<<0<<endl;
return 0;
}
a=b/a;b=0;
for (int i=2;i<=a;i++)
if (zhi(i))
{
if (a%i==0) b++;
while (a%i==0)
a/=i;
}
a=pow(2,b);
cout<<a<<endl;
return 0;
}
附:大神blog: http://blog.csdn.net/liveas/article/details/5739419