为什么这样只有30分
#include<bits/stdc++.h>
#define int __int128
using namespace std;
inline int read()
{
char c=getchar();int x=0;bool f=0;
for(;!isdigit(c);c=getchar())f^=!(c^45);
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
if(f)x=-x;return x;
}
void print(int x){
int sta[35];
int top=0;
do
{
sta[top++]=x%10,x/=10;
}while(x);
while(top) putchar(sta[--top]+'0');
}
int k[21][2],j[21],l[21];
int abss(int x)
{
if(x<0) return -x;
else return x;
}
signed main()
{
int T,a,b,c,d,km,km2,p,s1,s2,s;
T=read();
for(int i=0;i<T;i++)
{
p=0,s=0;
a=read();b=read();c=read();d=read();
km2=km=a*c*c*d;
if(km2%2==0) k[p][1]=2;
else goto ymx;
while(km2%2==0)
{
km2/=2;
k[p][0]++;
}
p++;
ymx:for(int i=3;i<1e6;i+=2)
{
if(km2%i==0) k[p][1]=i;
else continue;
while(km2%i==0)
{
km2/=i;
k[p][0]++;
}
p++;
if(km2==1) break;
}
for(j[0]=0;j[0]<=k[0][0];j[0]++)
for(j[1]=0;j[1]<=k[1][0];j[1]++)
for(j[2]=0;j[2]<=k[2][0];j[2]++)
for(j[3]=0;j[3]<=k[3][0];j[3]++)
for(j[4]=0;j[4]<=k[4][0];j[4]++)
for(j[5]=0;j[5]<=k[5][0];j[5]++)
for(j[6]=0;j[6]<=k[6][0];j[6]++)
for(j[7]=0;j[7]<=k[7][0];j[7]++)
for(j[8]=0;j[8]<=k[8][0];j[8]++)
for(j[9]=0;j[9]<=k[9][0];j[9]++)
for(j[10]=0;j[10]<=k[10][0];j[10]++)
for(j[11]=0;j[11]<=k[11][0];j[11]++)
for(j[12]=0;j[12]<=k[12][0];j[12]++)
for(j[13]=0;j[13]<=k[13][0];j[13]++)
for(j[14]=0;j[14]<=k[14][0];j[14]++)
for(j[15]=0;j[15]<=k[15][0];j[15]++)
for(j[16]=0;j[16]<=k[16][0];j[16]++)
for(j[17]=0;j[17]<=k[17][0];j[17]++)
for(j[18]=0;j[18]<=k[18][0];j[18]++)
for(j[19]=0;j[19]<=k[19][0];j[19]++)
{
//print(p);
s1=1;
for(int i=0;i<p;i++)
{
l[i]=j[i];
while(l[i]--)
{
s1*=k[i][1];
}
}
s2=km/s1;
if(s1-a*c>0&&c*d-s2>0&&((s1-a*c))%b==0&&((c*d-s2))%b==0) s++;
}
print(s);
putchar('\n');
memset(k,0,sizeof(k));
}
return 0;
}
而仅仅将这块的
if(s1-a*c>0&&c*d-s2>0&&((s1-a*c))%b==0&&((c*d-s2))%b==0) s++;
改为
if(s1-a*c>0&&c*d-s2>0&&(abss(s1-a*c))%b==0&&(abss(c*d-s2))%b==0) s++;
就可以AC了,我觉得这两个效果是一样的吧