洛谷P1029 题解(不用gcd版)

洛谷P1029 题解(不用gcd版)

题目描述

输入两个正整数 x0,y0​,求出满足下列条件的 P,Q 的个数:

  1. P,Q 是正整数。

  2. 要求 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;
}

总结

  1. 如果数据范围太大,考虑到限时,就尽量减少循环层数,最大限度优化代码时间复杂度。
  2. 也可以通过减少循环次数来优化,但优先减少层数。

个人因为先考虑了减少循环次数,而造成了时间复杂度虽有下降但不够(用双重循环从60分到70再到80),还造成了对特殊数据的处理出错的问题(没考虑输入x y相等的情况)。所以要优先减少循环层数。

发布了6 篇原创文章 · 获赞 1 · 访问量 164

猜你喜欢

转载自blog.csdn.net/Krazy_D/article/details/104176935