90pts求优化
查看原帖
90pts求优化
774384
Misaka_mzany楼主2023/11/25 12:57

T了第四个点 望大佬捞一下

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll gcd(ll x,ll y){
	ll i;
	for(i = min(abs(x),abs(y));i>=1;i--)if(x%i==0&&y%i==0)return i;
	return i;
}
int main(){
	ll n,m;
	scanf("%lld%lld",&n,&m);
	while(n--){
		ll a,b,c;
		scanf("%lld%lld%lld",&a,&b,&c);
		ll det=b*b-4*a*c;
		if(det<0){
			cout<<"NO"<<endl;
			continue;
		}
		ll sdet=sqrt(det);
		if(sdet*sdet==det){
			b*=-1;
			if(2*a>0)b+=sdet;
			else b-=sdet;
			if(b==0){
			cout<<b<<endl;
				continue;
			}
			int q=gcd(b,2*a);
			if(q==0)q=max(b,2*a);
			if(q==2*a)cout<<b/2/a<<endl;
			else if(q==-2*a)cout<<b/2/a<<endl;
			else if(a*2>0)cout<<b/q <<"/"<<a*2/q<<endl;
			else cout<< b/q*(-1)<<"/"<<a*2/q*(-1)<<endl;
		}
		
		else{
			ll p=0;
			for(ll i=1;i<det/2;i++){
				if(det%(i*i)==0)p=i;
			}
			det/=p*p;
			ll q=gcd(p,b);
			if(q==0)q=max(p,b);
			q=gcd(q,2*a);
			ll tq=gcd(2*a,b);
			ll dq=gcd(p,2*a);
			if(tq==0)tq=max(2*a,b);
			if(dq==0)dq=max(2*a,p); 
			if(2*a<0){
				p*=-1;
				p=abs(p);
				b*=-1;
				a*=-1;
			}	
			if((2*a)/q==1){
				if(b!=0)cout<< -1*b/q;
				if(p>0&&b!=0)cout<<"+";
				if(abs(p/q)!=1)cout<<p/q<<"*";
				cout<<"sqrt("<<det<<")"<<endl;
			}
			else{
				if(b!=0&&abs(-1*b/tq)%abs(2*a/tq)!=0)cout<< -1*b/tq<<"/"<<2*a/tq;
				else if(b!=0)cout<<(-1*b/q)/(2*a/q);
				if(p>0&&b!=0)cout<<"+";
				if(abs(p/dq)!=1)cout<<p/dq<<"*";
				cout<<"sqrt("<<det<<")";
				if(abs(2*a/dq)!=1)cout<<"/"<< abs(2*a/dq)<<endl;	
				else cout<<endl;			
			}
		}
	}

	return 0;
} 
2023/11/25 12:57
加载中...