30pts求调 在线等
查看原帖
30pts求调 在线等
540792
grassblock__楼主2024/8/15 10:38
#include<bits/stdc++.h>
using namespace std;
int gcd(int x,int y){
	bool tag=(x*y>0?1:-1);
	x=max(x,-x),y=max(y,-y);
	if(x<y)swap(x,y);
	if(x==0||y==0)return 0;
	if(x%y==0)return tag*y;
	return tag*gcd(y,x%y);
}
void print(int q,int r,int s){
	if(s==0||q==0||r==0)
		return;
	int g=gcd(q,r);
	q/=g,r/=g;
	if(r<0)q=-q,r=-r;
	else if(s==1)
		if(r==1)printf("%d",q);
		else printf("%d/%d",q,r);
	else
		if(r==1)
			if(q==1)printf("sqrt(%d)",s);
			else printf("%d*sqrt(%d)",q,s);
		else
			if(q==1)printf("sqrt(%d)/%d",s,r);
			else printf("%d*sqrt(%d)/%d",q,s,r);
}
void solve(int a,int b,int c){
	int delta=b*b-4*a*c;
	if(a<0)a=-a,b=-b,c=-c;
	if(delta<0){
		printf("NO");
		return;
	}
	if(b==0&&c==0){
		printf("0");
		return;
	}
	int q=1,d=delta;
	for(int i=2;i*i<=delta;i++)
		while(d%(i*i)==0){
			d/=(i*i);
			q*=i;
		}
	if(d==1)print(q-b,2*a,1);
	else{
		print(-b,2*a,1);
		if(q==0||d==0)return;
		if(2*a*q>0&&a!=0&&b!=0)printf("+");
		print(q,2*a,d);
	}
}
int main(){
	int T,M;
	scanf("%d%d",&T,&M);
	while(T--){
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c);
		solve(a,b,c);
		printf("\n");
	}
	return 0;
}
2024/8/15 10:38
加载中...