好题。
(解法不写了
#include<iostream>
#include<cstdio>
using namespace std;
int n;
int vis[50005],prim[50005],cnt;
int ans;
int cal(int x,int y)
{
int ret=0;
while(x&&x%y==0)
{
x/=y;
++ret;
}
return ret;
}
bool addans(int a,int b,int c,int d,int p)
{
int sa,sb,sc,sd;
sa=cal(a,p);
sc=cal(c,p);
sb=cal(b,p);
sd=cal(d,p);
if(sa<sc||sb>sd)return ans=0;
if(sa>sc)
{
if(sb<sd)
{
if(sc!=sd)return ans=0;
else ans*=1;
}
else
{
if(sc>sd)return ans=0;
else ans*=1;
}
}
else
{
if(sb<sd)
{
if(sd<sc)return ans=0;
else ans*=1;
}
else
{
if(sc>sd)return ans=0;
else ans*=(sd-sc+1);
}
}
return 1;
}
int main()
{
for(int i=2;i<=50000;++i)
{
if(!vis[i])vis[i]=i,prim[++cnt]=i;
for(int j=1;j<=cnt;++j)
{
if(prim[j]>vis[i]||50000/prim[j]<i)break;
vis[prim[j]*i]=prim[j];
}
}
scanf("%d",&n);
while(n--)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&c,&b,&d);
ans=1;
bool mark=false;
int td=d;
for(int i=1;i<=cnt;++i)
{
if(prim[i]>td)break;
if(td%prim[i]==0)
{
if(!addans(a,b,c,d,prim[i]))break;
while(td%prim[i]==0)td/=prim[i];
}
}
if(ans&&td!=1)addans(a,b,c,d,td);
if(!mark)--cnt;
printf("%d\n",ans);
}
return 0;
}