题目链接:https://www.acwing.com/problem/content/202/
思路:由于x是b1的约数,所以x的质因子一定也是b1的质因子,
我们可以对b1的每个质因子p,分别计算a0,a1,b0,b1分别
包含多少个p.然后讨论x可能含有几个p即可
#include<iostream> #include<algorithm> #include<string> #include<cstring> #include<cstdio> #include<cmath> using namespace std; int a[100005],b[100005]; int main() { int k=0; for(int i=2; i<=100000; i++) { if(b[i]==0) { a[++k]=i; for(int j=i; j<=100000/i; j++) b[j*i]=1; } } int t,n,x0,x1,y0,y1; scanf("%d",&t); while(t--) { scanf("%d %d %d %d",&x0,&x1,&y0,&y1); int ans=1; for(int i=1; i<=k; i++) { int s=0; if(y1==1) break; if(y1%a[i]==0) { while(y1%a[i]==0) { s++; y1=y1/a[i]; } int u1=0,u2=0,u3=0; while(x0%a[i]==0) { x0=x0/a[i]; u1++; } while(x1%a[i]==0) { x1=x1/a[i]; u2++; } while(y0%a[i]==0) { y0=y0/a[i]; u3++; } if(u1==u2&&u3<s&&s<u1) { ans=0; y1=1; break; } else if(u1==u2&&u3==s) { if(s<u1) { y1=1; ans=0; break; } else { ans=ans*(s-u1+1); } } else if(u1>u2&&u3<s&&s!=u2) { ans=0; y1=1; break; } else if(u1>u2&&u3==s&&u2>s) { ans=0; y1=1; break; } } } if(y1>1) { if(y0==y1&&x1==1) ans=ans*2; else if(x1!=1) ans=0; } printf("%d ",ans); } }
;