大佬们 50pts csp赛前求助(C++)
查看原帖
大佬们 50pts csp赛前求助(C++)
726902
bcbgszyzh楼主2024/10/24 13:46
#include<bits/stdc++.h>
using namespace std;
int main(){
	int t,m;
	scanf("%d%d",&t,&m);
	while(t--){
		long long a,b,c;
		scanf("%lld%lld%lld",&a,&b,&c);
		int delta=b*b-4*a*c;
		if(delta<0){
			puts("NO");
		}else if(delta==0){
			long long p=-b,q=2*a;
			long long gcdpq=__gcd(abs(p),abs(q));
			p/=gcdpq,q/=gcdpq;
			if(q<0)q=-q,p=-p;
			if(q==1)printf("%lld\n",p);
			else printf("%lld/%lld\n",p,q);
		}else{
			long long p=-b,q=2*a;
			double sq=(long long)sqrt(delta);
			if(sq*sq==delta){
				if(q>0)p+=sq;
				else p-=sq;
				long long gcdpq=__gcd(abs(p),abs(q));
				p/=gcdpq,q/=gcdpq;
				if(q<0)p=-p,q=-q;
				if(q==1)printf("%lld\n",p);
				else printf("%lld/%lld",p,q);
			}else{
				long long gcdpq=__gcd(abs(p),abs(q));
				p/=gcdpq,q/=gcdpq;
				if(q<0)q=-q,p=-p;
				if(p!=0){
					if(q==1)printf("%lld+",p);
					else printf("%lld/%lld+",p,q);
				}
				q=abs(2*a),p=1;long long t=0;
				for(int x=sq;x>=1;--x){
					if(delta%(x*x)==0){
						p*=x,t=delta/(x*x);
						break;
					}
				}
				gcdpq=__gcd(abs(p),abs(q));
				p/=gcdpq,q/=gcdpq;
				if(q<0)q=-q,p=-p;
				if(p==q)printf("sqrt(%lld)\n",t);
				else if(q==1)printf("%lld*sqrt(%lld)\n",p,t);
				else if(p==1)printf("sqrt(%lld)/%lld\n",t,q);
				else printf("%lld*sqrt(%lld)/%lld\n",p,t,q);
			}
		}
	}
	return 0;
}
2024/10/24 13:46
加载中...