Hankson的趣味题
题目链接: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\n",ans);
}
}
;
浙公网安备 33010602011771号