「一本通 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;
}
    
原文地址:https://www.cnblogs.com/huihao/p/11746339.html