80pts求调,最后两个点没过
查看原帖
80pts求调,最后两个点没过
1320943
Winter_and_Autumn楼主2024/10/11 13:57
#include<bits/stdc++.h>
using namespace std;
int n,t,a,b,c,delta;
int gcd(int a,int b){if(b==0)return a;return gcd(b,a%b);}
int sSqrt(int x){
	int ans=1;
	for(int i=sqrt(x);i>1;i--){
		if(x<i*i)continue;
		if(x%(i*i)==0)ans*=i,x/=i*i;
		if(x==1)return ans;
	}
	return ans;
}
void printAns(int p1,int q1,int p2,int q2,int r){
	if(p1==0 and r==0){cout<<0;return ;}
	if(q1==q2 and r==1){
		int t=p1+p2;
		if(t*q1<0)cout<<"-";
		int g=gcd(abs(t),abs(q1));
		t/=g;
		q1/=g;
		if(abs(q1)==1)cout<<abs(t);
		else cout<<abs(t)<<"/"<<abs(q1);
		return ; 
	}
	if(p1!=0){
		if(p1*q1<0)cout<<"-";
		if(abs(q1)==1)cout<<abs(p1);
		else cout<<abs(p1)<<"/"<<abs(q1);
	}
	if(r!=0){
		if(p2*q2<0)cout<<"-";
		if(p2*q2>0 and p1!=0)cout<<"+";
		if(r==1){
			if(abs(q2)==1)cout<<abs(p2);
			else cout<<abs(p2)<<"/"<<abs(q2);
		}else{
			if(abs(p2)!=1)cout<<abs(p2)<<"*";
			cout<<"sqrt("<<r<<")";
			if(abs(q2)!=1)cout<<"/"<<abs(q2);
		}
	}
}
int main(){
	cin>>n>>t;
	for(int i=1,p1,q1,p2,q2,g1,g2,w;i<=n;i++){
		cin>>a>>b>>c;
		if(a<0)a=-a,b=-b,c=-c;
		delta=b*b-4*a*c;
		if(delta<0){cout<<"NO"<<endl;continue;}
//		cout<<"jkfsadlksadkl"<<endl;
		w=sSqrt(delta);g1=gcd(abs(-b),abs(2*a));g2=gcd(w,abs(2*a));
//		cout<<g1<<" "<<g2<<endl; 
		p1=(-b)/g1,q1=(2*a)/g1,p2=w/g2,q2=2*a/g2,delta/=w*w;
//		cout<<p1<<" "<<q1<<" "<<p2<<" "<<q2<<" "<<delta<<endl;
		printAns(p1,q1,p2,q2,delta);
		cout<<endl;
	}
	return 0;
} 
2024/10/11 13:57
加载中...