60pts求助
查看原帖
60pts求助
1013142
Chizuru_Ichinose楼主2023/11/20 20:07
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll T,A,B,C,M;
void output(int molecule,int denominator){
	//The denominator cannot be negative
	ll Gcd=__gcd(molecule,denominator);
	molecule/=Gcd; denominator/=Gcd;
	if(denominator<0){
		denominator=-denominator;
		molecule=-molecule;
	}
	if(denominator==1){
		cout<<molecule;
		return ;//Divisible
	}
	cout<<molecule<<'/'<<denominator;
	return ;
	
}
ll delta(ll N,ll M,ll K){
	return M*M-4*N*K;
}
void imitate(ll a,ll b,ll c){
	ll D=delta(a,b,c);
	//situation 1
	if(D<0){
		cout<<"NO"<<endl;
		return ;
	}
	//situation 2
	if(D==0){
		output(-b,2*a);
		cout<<endl;
		return ;
	}
	//situation 3
	//D>0 and D is a perfectly squared number
	if(sqrt(D)*sqrt(D)==D) {
		ll p;
		if(a<0) p=-b-sqrt(D);
		else p=-b+sqrt(D);
		output(p,2*a);
		cout<<endl;
		return ;
	}
	//situation 4
	//D>0 and D isnot a perfectly squared number
	if(b!=0){
		output(-b,2*a);
		if(a<0) cout<<'-';
		else cout<<'+';
	}
	ll accumulate=1;
	for(int i=2;i*i<=D;i++){
		if(D%(i*i)==0){
			accumulate*=i;
			D/=(i*i);
		}
	}
	// bool enti=true;
	// if(accumulate%(2*a)==0){
		// accumulate/=(2*a);
		// enti=false;
	// }
	ll temp=2*a;
	ll gCd=__gcd(accumulate,temp);
	accumulate/=gCd; temp/=gCd;
	if(accumulate!=1) cout<<accumulate<<'*';
	cout<<"sqrt("<<D<<")";
	// if(enti==true)cout<<'/'<<2*a;
	if(temp!=1) cout<<'/'<<temp;
	cout<<'\n';
	return ;
	
}
int main(void){
	cin>>T>>M;
	while(T--){
		cin>>A>>B>>C;
		imitate(A,B,C);
	}
	
	return 0;
}
2023/11/20 20:07
加载中...