「一本通 6.3 例 2」Hankson 的趣味题

Posted huihao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「一本通 6.3 例 2」Hankson 的趣味题相关的知识,希望对你有一定的参考价值。

不用longlong上一题可以证明

思路一:

 

#include<bits/stdc++.h>
using namespace std;
const int N=44722;
int n,a0,a1,b0,b1,ans;
int p[N+10];
bool vis[N+10];
void get_prime(){
    for(int i=2;i<=N;++i){
        if(!vis[i]) p[++p[0]]=i;
        for(int j=1;j<=p[0]&&i*p[j]<=N;++j){
            vis[i*p[j]]=1;
            if(i%p[j]==0) break;
        }
    }
}
inline void calc(int x){
    int t1=0,t2=0,t3=0,t4=0;
    while(a0%x==0){ a0/=x; t1++; }
    while(a1%x==0){ a1/=x; t2++; }
    while(b0%x==0){ b0/=x; t3++; }
    while(b1%x==0){ b1/=x; t4++; }
    if(t1<t2||t3>t4||t4<t2) ans=0;
    if(t1>t2&&t4>t3&&t4>t2) ans=0;
    if(t1==t2&&t3==t4) ans*=(t4-t2+1);
    return;
}
int main(){
    get_prime();
    scanf("%d",&n);
    while(n--){
        ans=1;
        scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
        for(int i=1;i<=p[0]&&ans;++i)
        if(b1%p[i]==0) calc(p[i]);
        if(b1>1) calc(b1);
        printf("%d
",ans);
    }
    return 0;
} 

 

 

思路二

 

#include<bits/stdc++.h>
using namespace std;
int n,a0,a1,b0,b1;
int gcd(int a,int b){
    if(!b) return a;
    return gcd(b,a%b);
}
inline bool pd(int i){
    int x=b1/b0*i;
    if(gcd(b0,x)==i&&gcd(a0,x)==a1)return 1;
    return 0;
}
int main(){
    scanf("%d",&n);
    while(n--){
        scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
        if(b1%b0){ puts("0"); continue;}
        int m=sqrt(b0),ans=0;
        for(int i=1;i<m;++i)
        if(b0%i==0){
            if(pd(i)) ans++;
            if(pd(b0/i)) ans++; 
        }
        if(pd(m)) ans++;
        if(m*m!=b0&&pd(b0/m)) ans++;
        printf("%d
",ans);
    }
    return 0;
}
    

 

以上是关于「一本通 6.3 例 2」Hankson 的趣味题的主要内容,如果未能解决你的问题,请参考以下文章

Noip2009 Hankson的趣味题

luogu1072Hankson 的趣味题 [数学]

P1072 Hankson 的趣味题

「一本通 6.3 例 1」反素数 Antiprime

Hankson 的趣味题

Hankson 的趣味题