题目描述
输入两个正整数 x0,y0 ,求出满足下列条件的 P, QP,Q 的个数:P,QP,Q 是正整数。要求 P, Q P,Q 以 x0为最大公约数,以y0为最小公倍数。
试求:满足条件的所有可能的 P, QP,Q 的个数。
输入格式
一行两个正整数 x0,y0.
输出格式
一行一个数,表示求出满足条件的 P, Q的个数。
输入输出样例
输入 #1
3 60
输出 #1
4
【题目来源】
NOIP 2001 普及组第二题
伪题解部分:
这道题是一个数学问题,核心在于构建一个能计算最大公因数的函数
函数如下:
int max(int a,int b)
{
int i,rem,d;
d=a;
for(i=1;i<d;i++)
{
rem=a%b;
if(rem==0)
{
return b;
}
else
{
a=b;
b=rem;
}
}
}
这里利用for循环实现了数学上的辗转相除法
传入两个操作数,经过辗转相除最终返回他们的最大公因数
然后在主函数里利用minimum=p*q/maximum的公式算出最小公倍数
完整代码如下:
#include<bits\stdc++.h>
int max(int,int);
int main()
{
int x,y,p,q,temp,maximum,sample=-1,minimum,i,j,count=0;
cin>>x>>y;
for(i=1;i<=y;i++)
{
for(j=1;j<=y;j++)
{
p=i;
q=j;
if(p<q)
{
temp=p;
p=q;
q=temp;
}
maximum=max(p,q);
minimum=p*q/maximum;
if(maximum==x&&minimum==y)
{
if(p==sample)
{
cout<<count*2;
return 0;
}
else
{
count++;
sample=p;
}
}
}
}
cout<<count;;
return 0;
}
int max(int a,int b)
{
int i,rem,d;
d=a;
for(i=1;i<d;i++)
{
rem=a%b;
if(rem==0)
{
return b;
}
else
{
a=b;
b=rem;
}
}