30球跳
查看原帖
30球跳
1071907
lzhgrq楼主2025/8/1 19:16
#include<bits/stdc++.h>
#define int long long 
using namespace std;
int t,m;
signed main(){
//	freopen("uqe.in","r",stdin);
//	freopen("uqe.out","w",stdout);
	scanf("%lld%lld",&t,&m);
	while(t--){
		int a,b,c;
		scanf("%lld%lld%lld",&a,&b,&c);
		int delta=b*b-4*a*c;
		if(delta<0){//无解 
			printf("No\n");
			continue;
		}
		else if(delta==0){//单个解 
			int temp=__gcd(2*a,-b);
			int mu=2*a/temp;
			int zi=-b/temp;
			if(mu<0){//分母不能有负号,转移至分子 
				mu*=(-1);
				zi*=(-1);
			}
			if(mu==1) printf("%lld\n",zi);//确保分母是1时不显示 
			else printf("%lld/%lld\n",zi,mu);
		}
		else{//
			int mu=2*a;
			int zi=-b;
			int z=1;	
			for(int i=2;i*i<=delta;i++){//化简根号 
				while(delta%(i*i)==0){
					z*=i;
					delta/=(i*i);
				}
			}
			if(delta==1){//根号1不出现 
				if(a>0){
					zi+=z;
				}
				else zi-=z;
				int temp=__gcd(zi,mu); 
				zi/=temp;
				mu/=temp;
				if(mu<0){
					mu*=(-1);
					zi*=(-1);
				} 
				if(mu==1) printf("%lld\n",zi);//确保分母是1时不显示 
				else printf("%lld/%lld\n",zi,mu);
			}
			else{//分两部分  -b/2a+-p*sqrt(q)/2a 
				int temp=__gcd(zi,mu);
				zi/=temp;
				mu/=temp;
				if(mu<0){
					mu*=(-1);
					zi*=(-1);
				} 
				if(mu==1&&zi){
					printf("%lld",zi);
				}
				else if(zi){
					printf("%lld/%lld",zi,mu);
				}
				if(zi){
					printf("+");
				} 
				if(a>0) zi=z;
				else zi=-z;
				mu=2*a;
				temp=__gcd(zi,mu);
				zi/=temp;
				mu/=temp;
				if(mu<0){
					mu*=(-1);
				} 
				if(mu==1){
					if(zi==1){
						printf("sqrt(%lld)\n",delta);
					}
					else{
						printf("%lld*sqrt(%lld)\n",zi,delta);
					}
				}
				else{
					if(zi==1){
						printf("sqrt(%lld)/%lld\n",delta,mu);
					}
					else{
						printf("%lld*sqrt(%lld)/%lld\n",zi,delta,mu);
					}
				}
			}
		}
	}
	fclose(stdin);
	fclose(stdout);//关闭 
	return 0;
}
2025/8/1 19:16
加载中...