洛谷 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;
    }    
}

 

posted @ 2019-08-20 17:37  神之右大臣  阅读(163)  评论(0编辑  收藏  举报