「一本通 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 的趣味题的主要内容,如果未能解决你的问题,请参考以下文章