社区讨论

求助 RE爆0!

P9750[CSP-J 2023] 一元二次方程参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@logkhugt
此快照首次捕获于
2023/11/02 10:28
2 年前
此快照最后确认于
2023/11/02 10:28
2 年前
查看原帖
考场代码
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;

int T,M;
int xx[60]= {0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600,1681,1764,1849,1936};

bool check_sqrt(int x)
{
	for(int i=0; i*i<=x; i++)
	{
		if(i*i==x)
			return true;
	}
	return false;
}
int Sqrt(int x)
{
	for(int i=0; i*i<=x; i++)
	{
		if(i*i==x)
			return i;
	}
}
int Gcd(int a,int b)
{
	if(a<b) return -1;
	if(a%b==0) return b;
	else return Gcd(b,a%b);
}
int Sqrt2(int d)
{
	for(int i=44; i>=1; i--)
	{
		if(Gcd(d,xx[i])==xx[i])
		{
			return i;
		}
	}
	return 1;
}

int main()
{
	//freopen("uqe.in","r",stdin);
	//freopen("uqe.out","w",stdout);

	scanf("%d%d",&T,&M);
	while(T--)
	{
		int a,b,c;
		cin>>a>>b>>c;
		int d=b*b-4*a*c;
		if(d<0)
		{
			printf("NO\n");
		}
		else if(check_sqrt(d))
		{
			int sd=Sqrt(d);
			int g=Gcd(max(abs(sd-b),abs(a*2)),min(abs(sd-b),abs(a*2)));
			if(g==abs(a*2))
			{
				printf("%d\n",(sd-b)/(a*2));
			}
			else
			{
				if((sd-b<0 && a<0) || (sd-b>0 && a>0))
					printf("%d/%d\n",abs(sd-b)/g,abs(a*2)/g);
				else
					printf("-%d/%d\n",abs(sd-b)/g,abs(a*2)/g);
			}
		}
		else
		{
			int q2=1,q3=d;
			q2=Sqrt2(d);
			q3=d/xx[q2];
			if(b!=0)
			{
				int g=Gcd(abs(b),abs(a*2));
				if(g==abs(a*2))
				{
					printf("%d",(-1*b)/(a*2));
				}
				else
				{
					if((b>0 && a<0) || (b<0 && a>0))
						printf("%d/%d",abs(b)/g,abs(a*2)/g);
					else
						printf("-%d/%d",abs(b)/g,abs(a*2)/g);
				}
				printf("+");
			}
			if(q2==a*2)
			{
				printf("sqrt(%d)\n",q3);
			}
			else if(Gcd(abs(q2),abs(a*2))==abs(a*2))
			{
				printf("%d*sqrt(%d)\n",q2/(a*2),q3);
			}
			else if(Gcd(abs(a*2),abs(q2))==abs(q2))
			{
				int g=Gcd(abs(a*2),abs(q2));
				printf("sqrt(%d)/%d\n",q3,(a*2)/g);
			}
			else
			{
				int g=Gcd(max(abs(a*2),abs(q2)),min(abs(a*2),abs(q2)));
				if((q2<0 && a<0) || (q2>0 && a>0))
					printf("%d*sqrt(%d)/%d\n",abs(q2)/g,q3,abs(a*2)/g);
				else
					printf("-%d*sqrt(%d)/%d\n",abs(q2)/g,q3,abs(a*2)/g);
			}
		}
	}

	cout<<endl;
	//fclose(stdin);
	//fclose(stdout);
	return 0;
}
  

回复

4 条回复,欢迎继续交流。

正在加载回复...