这个题一本通上有,但是为了增强我们的创新精神,思维能力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里特判一下