已经AC了,但还有一些不解
查看原帖
已经AC了,但还有一些不解
162151
Mingxuan楼主2022/8/17 14:06

为什么这样只有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了,我觉得这两个效果是一样的吧

2022/8/17 14:06
加载中...