zoukankan      html  css  js  c++  java
  • 洛谷 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;
        }    
    }
  • 相关阅读:
    websocket 学习笔记
    oxy 学习笔记
    postcss
    一致性hash和chord
    leveldb 学习笔记
    logrus 学习笔记
    viper 学习笔记
    redigo 学习笔记
    gin 学习笔记
    修改TOMCAT的JVM虚拟机内存大小几种方式
  • 原文地址:https://www.cnblogs.com/kamimxr/p/11384414.html
Copyright © 2011-2022 走看看