4. [2001年NOIP普及组] 最大公约数和最小公倍数问题
题目链接(码学堂,数据弱)
摘要:
1.P,Q是正整数(unsigned)
2.要求P,Q以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的两个正整数的个数.
分析1:
暴力枚举,看这两个数的最大公约数和最小公倍数是否与题目一样
1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 using namespace std; 5 long long p,q; 6 long long ans; 7 long long lcm(int x,int y) 8 { 9 long long xx=x/p; 10 long long yy=y/p; 11 return xx*yy*p; 12 } 13 long long gcd(long long x,long long y) 14 { 15 if(x%y==0) return y; 16 else return gcd(y,x%y); 17 } 18 int main() 19 { 20 cin>>p>>q; 21 for(long long i=0;i<=q;i+=p)//优化细节1:跳跃式枚举 22 for(long long j=0;j<=q;j+=p) 23 if(lcm(i,j)==q&&gcd(i,j)==p) 24 { 25 ans++; 26 if(i==j) ans--;//注意位置!//平方的特殊情况! 27 } 28 cout<<ans; 29 return 0; 30 }
分析2:
数论做法