60分求调
查看原帖
60分求调
981822
_liukelin_楼主2024/10/7 18:28
#include<bits/stdc++.h>
using namespace std;
int t,m,a,b,c,q,p;
int delta;

int gcd(int a,int b){
	return b==0? a:gcd(b,a%b);
}

void ylg(){
	delta=sqrt(delta);
	q=delta-b;
	int tem=gcd(abs(a*2),abs(q));
	a*=2;
	if(delta==0){
		if(abs(q)%a==0){
			cout<<q/a<<'\n';
		}
		else{
			q/=tem;
			a/=tem;
			cout<<q<<"/"<<a<<'\n';
		}
	}
	else{
		if(abs(q)%a==0){
			cout<<q/a<<'\n';
		}
		else{
			q/=tem;
			a/=tem;
			cout<<q<<"/"<<a<<'\n';
		}
	}
	
}

void wlg(){
	bool f=0;
	int s=sqrt(delta)+1,tot=1;
	for(int j=1;j<=100;j++){
		for(int i=1;i<=s;i++){
			if(delta%(i*i)==0)tot*=i,delta/=(i*i);
		}
	}
	
	if(b==0){
		int tem=gcd(tot,abs(a*2));
		if(a*2==tot){
			cout<<tot/tem<<"*sqrt("<<delta<<")\n";
		}
		else{
			cout<<tot/tem<<"*sqrt("<<delta<<")/"<<a*2/tem<<"\n";
		}
	}
	else{
		int tem=gcd(abs(b),gcd(tot,abs(a*2)));
		if(tem==a*2){
			if(tem==tot){
				if(abs(b)==tem)cout<<-b/tem;
				else if(abs(b)==abs(a*2))cout<<1;
				else cout<<-b/tem;
				if(tem==a*2){
					cout<<"+sqrt("<<delta<<")\n";
				}
				else
					cout<<"+sqrt("<<delta<<")\n";
			}
			else{
				if(abs(b)==tem)cout<<-b/tem;
				else if(abs(b)==abs(a*2))cout<<1;
				else cout<<-b/tem;
				if(tem==a*2){
					cout<<"+sqrt("<<delta<<")\n";
				}
				else
					cout<<"+"<<tot/tem<<"*sqrt("<<delta<<")\n"; 
			}
		}
		else{
			if(tem==tot){
				if(abs(b)==tem)cout<<-b/tem;
				else if(abs(b)==abs(a*2))cout<<1;
				else cout<<-b/tem<<"/"<<a*2/tem;
				if(tem==a*2){
					cout<<"+sqrt("<<delta<<")\n";
				}
				else
					cout<<"+sqrt("<<delta<<")/"<<(a*2)/tem<<"\n";
			}
			else{
				if(tot%(a*2/tem)==0){
					if((-b/tem)%(a*2/tem)==0){
						cout<<(-b/tem)/(a*2/tem)<<"+"<<tot/tem/(a*2/tem)<<"*sqrt("<<delta<<")"<<"\n";
					}
					else{
						cout<<-b/tem<<"/"<<a*2/tem<<"+"<<tot/tem/(a*2/tem)<<"*sqrt("<<delta<<")"<<"\n";
					}
					
				}
				else{
					cout<<-b/tem<<"/"<<a*2/tem<<"+"<<tot/tem<<"*sqrt("<<delta<<")/"<<a*2/tem<<"\n";
				}
			}
		}
	}
}

int main(){
//	freopen("C:\\Users\\lenovo\\Downloads\\uqe\\uqe2.in","r",stdin);
//	freopen("C:\\Users\\lenovo\\Downloads\\uqe\\uqe2.out","w",stdout);
	cin>>t>>m;
	while(t--){
		cin>>a>>b>>c;
		if(a<0){
			a=-a;
			b=-b;
			c=-c;
		}
		delta=b*b-4*a*c;
		int _=sqrt(delta);
		if(delta<0){
			cout<<"NO\n";
			continue;
		}
		else if(_*_==delta){
			ylg();
		}
		else{
			wlg();
		}
	}
	return 0;
}

wlg是无理根的情况

ylg是有理根的情况

2024/10/7 18:28
加载中...