使用李煜东的蓝书上的方法(p143~144)
#include<bits/stdc++.h>
#define ll long long int
using namespace std;
ll v[45000],p[4666],a,b,c,d,sum=0,n,tmp,ans=1;
void ss(ll nn)
{
memset(v,0,sizeof(v));
memset(p,0,sizeof(p));
ll m=0;
for(ll i=2;i<=nn;i++)
{
if(v[i]==0){v[i]=i;p[++m]=i;}
for(ll j=1;j<=m;j++)
{
if(p[j]>v[i]||p[j]>nn/i)break;
v[i*p[j]]=p[j];
}
}
}
//筛出根号2*10^9以内的质数
int main()
{
ss(44722);
p[4649]=0x7fffffff;
cin>>n;
for(ll ii=1;ii<=n;ii++)
{
cin>>a>>c>>b>>d;
ll i=1;ans=1;
while(p[i]<=d)
{
ll aq=0,bq=0,cq=0,dq=0;
if(d%p[i]==0)
{
sum=0;
tmp=a;while(tmp%p[i]==0){aq++;tmp/=p[i];}
tmp=b;while(tmp%p[i]==0){bq++;tmp/=p[i];}
tmp=c;while(tmp%p[i]==0){cq++;tmp/=p[i];}
tmp=d;while(tmp%p[i]==0){dq++;tmp/=p[i];}
if(aq>cq&&bq<dq&&cq==dq)sum=1;
if(aq>cq&&bq==dq&&cq<=dq)sum=1;
if(aq==cq&&bq<dq&&cq<=dq)sum=1;
if(aq==cq&&bq==dq&&cq<=dq)sum=dq-cq+1;
ans*=sum;
}
i++;
}
cout<<ans<<endl;
}
return 0;
}
各位神犇救救孩子罢(悲