• 【Luogu】P1072 Hankson 的趣味题 题解


    原题链接

    嗯...通过标签我们易得知,这是一道数学题(废话)

    其中,题目给了这两个条件:

    (gcd(x,a_0)=a_1,lcm(x,b_0)=b_1)

    所以,根据 (gcd)(lcm) 的性质,我们可以得到如下结论:

    (a_1|x,x|b_1) , ({x} over a_1)(a_0 over a_1) 互质, (b_1 over x)(b_1 over b_0) 互质。

    (请自行思考原因)

    有了这个结论,接下来的枚举就十分简单了。直接枚举 (b_1) 所有的因数,然后判断、累加答案即可。

    代码时间:

    #include <iostream>                                                                                  
    #include <cstdio>                                                                                    
    #include <cmath>                                                                                     
    using namespace std;                                                                                 
    int ans,n,a0,a1,b0,b1;                                                                               
    //gcd(x/a1,a0/a1)=1,gcd(b1/x,b1/b0)=1                                                                
    int gcd(int x,int y){                                                                                
        return x==0?y:gcd(y%x,x);                                                                        
    }                                                                                                    
                                                                                                         
    int main(){                                                                                          
        cin>>n;                                                                                          
        while(n--){                                                                                      
            ans=0;                                                                                       
            scanf("%d%d%d%d",&a0,&a1,&b0,&b1);                                                           
            int i=a0/a1,j=b1/b0;                                                                         
            for(int u=1;u*u<=b1;u++){                                                                    
                if(b1%u==0){                                                                             
                    int v=b1/u;                                                                          
                    if(u!=v){                                                                            
                        if(u%a1==0&&gcd(u/a1,i)==1&&b1%u==0&&gcd(b1/u,j)==1) ans++;                      
                        if(v%a1==0&&gcd(v/a1,i)==1&&b1%v==0&&gcd(b1/v,j)==1) ans++;                      
                    }                                                                                    
                    else{//注意此处,有可能枚举的u=v,并且两者都满足条件,就重复累加了ans,所以需特殊判断                                                                                
                        if(u%a1==0&&gcd(u/a1,i)==1&&b1%u==0&&gcd(b1/u,j)==1) ans++;                      
                    }                                                                                    
                }                                                                                        
            }                                                                                            
            cout<<ans<<endl;                                                                             
        }                                                                                                
        return 0;                                                                                        
    }                                                                                                    
    

    蒟蒻第一次写博客,请大佬多多指教!

  • 相关阅读:
    欧拉公式
    isap的一些想法
    错误合集
    Hello World
    PAT (Advanced Level) Practice 1068 Find More Coins
    PAT (Advanced Level) 1087 All Roads Lead to Rome
    PAT (Advanced Level) 1075 PAT Judge
    PAT (Advanced Level) 1067 Sort with Swap(0, i)
    PAT (Advanced Level) 1017 Queueing at Bank
    PAT (Advanced Level) 1025 PAT Ranking
  • 原文地址:https://www.cnblogs.com/acceptedzhs/p/12209521.html
Copyright © 2020-2023  润新知