P1072Hankson的趣味题

传送

这个题一本通上有,但是为了增强我们的创新精神,思维能力balabala,书上的满分程序不全,要优化一下,在此写一下第二种方法

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long k,n,a0,a1,b0,b1,ans;
long long gcd(long long a,long long b)
{
    if(b==0)return a;
    else{return gcd(b,a%b);
    }
}
int main()
{
    cin>>n;
    for(long long i=1;i<=n;i++)
    {   ans=0;
        cin>>a0>>a1>>b0>>b1;
        for(long long j=1;j<=sqrt(b0);j++)
        { if(b0%j==0)
          {k=b1/b0*j;
          if(gcd(k,a0)==a1&&j==gcd(k,b0))ans++;
          k=b1/b0*(b0/j);
          if(b0/j!=j&&gcd(k,a0)==a1&&gcd(k,b0)==b0/j)ans++;  
          }
        }
        long long t=sqrt(b0);
          if(t!=b0&&t*t==b0&&b0%k==t)
          {k=b1/b0*t;
            if(gcd(k,a0)==a1&&t==gcd(k,b0))ans++;
          }
        cout<<ans<<endl;
    }
}

书上从1到√b0枚举gcd(x,b0),并分i为gcd(x,b0),b0/i为gcd(x,b0)以及特判i*i=b0,但是会出现一个i被多次判断的情况,所以要在if里特判一下

猜你喜欢

转载自www.cnblogs.com/lcez56jsy/p/10549025.html
今日推荐