csp-j T3 30pts 求助(悬关)
  • 板块学术版
  • 楼主9gehetao
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/10/22 21:27
  • 上次更新2023/11/2 11:47:31
查看原帖
csp-j T3 30pts 求助(悬关)
600143
9gehetao楼主2023/10/22 21:27
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
	if(!b) return a;
	return gcd(b,a%b);
}
int main(){
	int T,M;
	cin>>T>>M;
	while(T--){
		int a,b,c;
		cin>>a>>b>>c;
		if((b*b-4*a*c)<0){
			puts("NO");
			continue;
		}
		if(a<0) a=-a,b=-b,c=-c;
		int l=sqrt(b*b-4*a*c);
		if(l*l==(b*b-4*a*c)){
		    int p=-b+l,q=2*a,g=gcd(p,q);
			p/=g,q/=g;
			if(p==0) puts("0");
			if(q==1) printf("%d\n",p);
			else{
				if((111*p*q)<0) p=-abs(p),q=abs(q);
				else  p=abs(p),q=abs(q);
				printf("%d/%d\n",p,q);
			}
		}
		else{
			int p=-b,q=2*a,g=gcd(p,q);
			bool flag=0;
			p/=g,q/=g;
			if(p!=0){
				if(q==1) printf("%d",p);
				else{
					if((111*p*q<0))p=-abs(p),q=abs(q);
					else p=abs(p),q=abs(q);
					printf("%d/%d",p,q);
				}
			}
			else flag=1;
			int k=b*b-4*a*c;
			p=1;
			for(int i=2;i*i<=k;i++)
			while(k%(i*i)==0)
			p*=i,k/=(i*i);
			assert(k!=1);
			q=2*a,g=gcd(p,q);
			p/=g,q/=g;
			if(p!=0){
				if(111*p*q<0) p=-abs(p),q=abs(q),assert(0);
				else{
					if(!flag) putchar('+');
					p=abs(p),q=abs(q);
				}
				if(q==1&&p==1) printf("sqrt(%d)\n",k);
				else  if(q==1) printf("%d*sqrt(%d)\n",p,k);
				else  if(p==1) printf("sqrt(%d)/%d\n",k,q);
				else  printf("%d*sqrt(%d)/%d\n",p,k,q);
			}
			else  assert(0),puts("");
		}
	}
	return 0;
}
2023/10/22 21:27
加载中...