题目描述
输入两个正整数 x0,y0,求出满足下列条件的 P,Q 的个数:
-
P,Q 是正整数。
-
要求 P,Q 以 x0 为最大公约数,以 y0为最小公倍数。
试求:满足条件的所有可能的 P,Q 的个数。
输入格式 一行两个正整数 x0,y0。
输出格式一行一个数,表示求出满足条件的 P,QP, QP,Q 的个数。
数据范围:2<=x,y<=105。
注意事项
P,Q的顺序可以颠倒,即12,15与15,12算作两个答案。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int ans=0,x,y;
bool huzhi(int m,int n){
for(int i=1;i<=;i++){ //从2到较小的那个数循环 找公因数
if(m%prime[i]==0&&n%prime[i]==0){return false;} //存在公因数就不互质
}
return true; //不存在就互质
}
int main(){
cin>>x>>y;
float pm=sqrt(x*y); //找x y的比例中项
for(int i=x;i<=pm;i+=x){ //从x正循环 y倒循环 到pm终止 步长为x保证i是x的倍数
int j=y*x/i;//i与j的关系
if(huzhi(i/x,j/x)){ //如果除以x互质 证明x是两数的最大公因数
int ex1=i/x,ex2=j/x; //找出两数分别的独有因数
if(ex1*ex2*x==y){ans+=2;cout<<i<<" "<<j<<"\n";} //如果最小公倍数是y 证明符合 答案就会出现一对
}
if(x!=y){cout<<ans<<"\n";}else{cout<<1<<"\n";}//如果x y相等,则只有一组答案
return 0;
}
总结
- 如果数据范围太大,考虑到限时,就尽量减少循环层数,最大限度优化代码时间复杂度。
- 也可以通过减少循环次数来优化,但优先减少层数。
个人因为先考虑了减少循环次数,而造成了时间复杂度虽有下降但不够(用双重循环从60分到70再到80),还造成了对特殊数据的处理出错的问题(没考虑输入x y相等的情况)。所以要优先减少循环层数。