洛谷 P1072 Hankson 的趣味题 题解
提前知识:gcd(a/d,b/d)*d=gcd(a,b);
lcm(a,b)=a*b/gcd(a,b);
那么可以比较轻松的算出:gcd(x/a1,a0/a1)==gcd(b1/b0,b1/x)==1;
那么我们求解的x仅仅从b1的因数中挑选就可以,x要符合以上条件且x%a1==0;
时间复杂度是O(sqrt(b1)*n+log(n));
#include <iostream> #include <cstring> #include <cmath> #define cin std::ios::sync_with_stdio(false); cin #define cout std::ios::sync_with_stdio(false); cout using namespace std; int a0,a1,b0,b1; int tmp[1000010]; int gcd(int a,int b) { if(!b) return a; return gcd(b,a%b); } int main() { register int t; cin>>t; while(t--){ cin>>a0>>a1>>b0>>b1; memset(tmp,0,sizeof(tmp)); tmp[0]=0; int op=sqrt(b1); for(register int i=1;i<=op;i++){ if(b1%i==0) tmp[++tmp[0]]=i; } int ans=0; for(register int i=1;i<=tmp[0];i++){ if(tmp[i]%a1==0&&gcd(tmp[i]/a1,a0/a1)==1&&gcd(b1/b0,b1/tmp[i])==1){ ++ans; } register int y=b1/tmp[i]; if(tmp[i]==y) continue; if(y%a1==0&&gcd(y/a1,a0/a1)==1&&gcd(b1/b0,b1/y)==1){ ++ans; } } cout<<ans<<endl; } }
众人皆醉我独醒,举世皆浊我独清