社区讨论

CSP-JT3玄关求调10分

灌水区参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo3xa1mu
此快照首次捕获于
2023/10/24 14:05
2 年前
此快照最后确认于
2023/11/02 11:36
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int f1,e1,fe1,k,x,y,z,zhea,T,m;
int sqr(int x){return x*x;}
int gcd(int x,int y){if(x%y==0)return y;return gcd(y,x%y);}
void find1(int x,int y,int z,int zhea){
	if((int)sqrt(zhea)*(int)sqrt(zhea)==zhea){
		f1=-y+sqrt(zhea);
		e1=2*x;
		if(f1%e1==0){cout<<f1/e1<<"\n";return ;}
		fe1=gcd(f1,e1);
		f1/=fe1;e1/=fe1;
		if(e1<0)e1=-e1,f1=-f1;
		cout<<f1/fe1<<"/"<<e1/fe1<<"\n";
		return ;
	}
	else{
		for(int i=sqrt(zhea);i>=1;i--)
		  if(zhea%(i*i)==0){
		  	k=i;
		  	break;
		  }
		f1=-y;
		e1=2*x;
		if(f1%e1==0&&f1!=0)cout<<f1/e1<<"+";
		else if(f1!=0){
			fe1=gcd(f1,e1);
			f1/=fe1;e1/=fe1;
			if(e1<0)e1=-e1,f1=-f1;
			cout<<f1<<"/"<<e1<<"+";
		}
		if(k!=1){
			f1=k;
			e1=2*x;
			if(f1%e1==0){
				if(f1/e1==1)cout<<"sqrt("<<zhea/k/k<<")\n";
				else cout<<f1/e1<<"*sqrt("<<zhea/k/k<<")\n";
			}
			else {
				fe1=gcd(f1,e1);
				f1/=fe1;e1/=fe1;
				if(e1<0)e1=-e1,f1=-f1;
				if(f1!=1)cout<<f1<<"*";
				cout<<"sqrt("<<zhea/k/k<<")";
				if(e1!=1)cout<<"/"<<e1<<"\n";
				else cout<<"\n";
			}
		}
		else {
			cout<<"sqrt("<<zhea/k/k<<")";
			if(2*x!=1)cout<<"/"<<-2*x<<"\n";
			else cout<<"\n";
		}
		
	}
	return ;
}
void find2(int x,int y,int z,int zhea){
	if((int)sqrt(zhea)*(int)sqrt(zhea)==zhea){
		f1=-y+sqrt(zhea);
		e1=2*x;
		if(f1%e1==0){cout<<f1/e1<<"\n";return ;}
		fe1=gcd(f1,e1);
		f1/=fe1;e1/=fe1;
		if(e1<0)e1=-e1,f1=-f1;
		cout<<f1<<"/"<<e1<<"\n";
		return ;
	}
	else{
		for(int i=sqrt(zhea);i>=1;i--)
		  if(zhea%(i*i)==0){
		  	k=i;
		  	break;
		  }
		f1=-y;
		e1=2*x;
		if(f1%e1==0&&f1!=0)
			cout<<f1/e1<<"+";
		else if(f1!=0){
			fe1=gcd(f1,e1);
			f1/=fe1;e1/=fe1;
			if(e1<0)e1=-e1,f1=-f1;
			cout<<f1<<"/"<<e1<<"+";
		}
		if(k!=1){
			f1=k;
			e1=2*x;
			if(f1%e1==0){
				if(f1/e1==1)cout<<"sqrt("<<zhea/k/k<<")\n";
				else cout<<f1/e1<<"*sqrt("<<zhea/k/k<<")\n";
			}
			else {
				fe1=gcd(f1,e1);
				f1/=fe1;e1/=fe1;
				if(f1!=1)cout<<f1<<"*";
				cout<<"sqrt("<<zhea/k/k<<")";
				if(e1!=1)cout<<"/"<<e1<<"\n";
				else cout<<"\n";
			}
		}
		else {
			cout<<"sqrt("<<zhea/k/k<<")";
			if(2*x!=1)cout<<"/"<<2*x<<"\n";
			else cout<<"\n";
		}
		
	}
	return ;
}
signed main(){
	cin>>T>>m;
	while(T--){
		cin>>x>>y>>z;
		zhea=y*y-4*x*z;
		if(zhea<0){cout<<"NO\n";continue;}
		if(x<0)find1(x,y,z,zhea);
		else find2(x,y,z,zhea);
	}
}

回复

1 条回复,欢迎继续交流。

正在加载回复...