【简单数学】【NOIP 2001】 最大公约数和最小公倍数问题
题目描述:
输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数。
条件:
1、P,Q是正整数
2、要求P,Q以x0为最大公约数,以y0为最小公倍数。
试求:满足条件的所有可能的两个正整数的个数。
输入输出:
输入只有一行,为两个正整数x0和y0。
输出只有一行,为满足条件的所有可能的两个正整数的个数。
样例:
输入:
x0=3 yo=60
输出:4说明(不用输出)此时的 P Q 分别为:
3 60
15 12
12 15
60 3
所以:满足条件的所有可能的两个正整数的个数共4种.
解法:
性质:最大公约数和最小公倍数的乘积就是原两个数的积: x0 y0 = P Q
1: p从1取到 x0*y0 , 求出每次的Q :(x0 * y0 ) / P =Q;
2: 求出每个 P 和 Q 的最大公约数gcd,如果== x0,那么最小公倍数lcm 也会== y0,即满足;
所以先把两数相乘(x0 * y0),再遍历他的因子即可。
。。。。超时了,for循环到 x0 *y0 超时,
等完全弄懂再补充。。
说是这个数一定不超过 sqrt(gcd * lcm) 因为 gcd≥2 ,所以没有 P == Q 相等的情况。
好吧,把for循环改改,
#include<iostream>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
if(b == 0){
return a;
}
return gcd(b,a%b);
}
int main(){
ll x,y;
cin>>x>>y;
ll ans=0;
// for(ll P=1; P< x*y; P++){ //修改
for(ll P=1; P *P< x*y;P++){
if(x*y % iP==0 && gcd(P,x*y /P)== x){
//ans +=1; //因为 两个数互换也成立 +2
ans +=2;
}
}
cout<<ans<<endl;
return 0;
}