显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
struct aa{
int v,t;
};
aa x[100001];
int fenjie(aa *p,int n)
{
int count=0,i=2;
while(i*i<=n)
{
if(!(n%i))
{
p[++count].v=i;
p[count].t=0;
while(!(n%i))
n/=i,p[count].t++;
}
i++;
}
if(n>1)
p[++count].v=n,p[count].t=1;
return count;
}
int work(int x,int i)
{
int count=0;
while(!(x%i))
x/=i,count++;
return count;
}
int main()
{
freopen("son.in","r",stdin);
freopen("son.out","w",stdout);
int i,t,j,a0,a1,b0,b1,num,minn,maxx,count,a,b,c,ans;
scanf("%d",&t);
while(t--)
{
//memset(x,0,sizeof(x));
scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
num=fenjie(x,b1);
// for(i=1;i<=num;i++)
// printf("%d %d\n",x[i].v,x[i].t);
ans=1;
for(i=1;i<=num;i++)
{
count=0;
a=work(a0,x[i].v);
b=work(a1,x[i].v);
c=work(b0,x[i].v);
//printf("\n%d %d %d %d\n",a,b,c,x[i].t);
// for(j=0;j<=x[i].t;j++)
// if(min(a,j)==b&&max(j,c)==x[i].t)
// count++;
if(a==b)
minn=a;
else
{
if(max(b,c)==x[i].t)
continue;
else
break;
}
if(c==x[i].t)
maxx=c;
else
{
if(min(a,x[i].t)==b)
continue;
else
break;
}
//printf("%d\n\n",x[i].t);
ans*=maxx-minn+1;
}
if(i==num+1)
printf("%d\n",ans);
else
printf("0\n");
}
return 0;
}