社区讨论

10分求调(玄关)

P9750[CSP-J 2023] 一元二次方程参与者 2已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mhjh9j7u
此快照首次捕获于
2025/11/04 02:32
4 个月前
此快照最后确认于
2025/11/04 02:32
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,M;
struct node{
	int a,b;
};
inline bool isp(int n){
	if(n<=1)return 1;
	for(int i=1;i*i<=n;i++)if(n%i==0)return 0;
	return 1;
}
inline vector<node>pf(int n){
	int i=-1;
	vector<node>res;
	for(int x=2;;x++){
		if(isp(n))break;
		i++;
		res.push_back({x,0});
		while(n%x==0){
			res[i].b++;
			n/=x;
		}
	}
	return res;
}
inline int p(int a,int b) {
	if (b==0)return 1;
	int res=p(a,b/2);
	if (b%2)return res*res*a;
	else return res*res;
}
signed main(){
	cin>>T>>M;
	while(T--){
		int a,b,c;
		cin>>a>>b>>c;
		int d=b*b-4*a*c;
		if(d<0){
			cout<<"NO"<<endl;
			continue;
		}
		int q1=-b,q2=1;
		vector<node>r=pf(d);
		for(int i=0;i<r.size();i++){
			if(r[i].b%2==0){
				q2*=p(r[i].a,r[i].b/2);
				d/=p(r[i].a,r[i].b);
			}else{
				q2*=p(r[i].a,(r[i].b-1)/2);
				d/=p(r[i].a,r[i].b-1);
			}
		}
		int v=((-b+q2*sqrt(d))*1.0/(2*a*1.0)>(-b-q2*sqrt(d))*1.0/(2*a*1.0)?1:-1);
		int a1=2*a,a2=2*a;
		int g1=gcd(abs(q1),abs(a1)),g2=gcd(abs(q2),abs(a2));
		q1/=g1;a1/=g1,q2/=g2,a2/=g2;
		if(a1<0){
			q1=-q1;
			a1=-a1;
		}
		if(a2<0){
			q2=-q2;
			a2=-a2;
		}
		if(d<=1){
			if(d==0){
				if(q1==0)cout<<0;
				else if(abs(q1)==1&&abs(a1)==1)cout<<q1/a1;
				else if(q1!=1&&a1==1)cout<<q1;
				else if(q1!=1&&a1==-1)cout<<-q1;
				else cout<<q1<<'/'<<a1;
			}else{
				if(a1==a2){
					int x=q1+q2;
					int g3=gcd(abs(x),abs(a1));
					x/=g3;
					a1/=g3;
					if(x==0)cout<<0;
					else if(abs(x)==1&&abs(a1)==1)cout<<x/a1;
					else if(x!=1&&a1==1)cout<<x;
					else if(x!=1&&a1==-1)cout<<-x;
					else cout<<x<<'/'<<a1;
				}else{
					if(q1==0)cout<<"";
					else if(abs(q1)==1&&abs(a1)==1)cout<<q1/a1;
					else if(q1!=1&&a1==1)cout<<q1;
					else if(q1!=1&&a1==-1)cout<<-q1;
					else cout<<q1<<'/'<<a1;
					int op=(q2>0?1:-1);
					if(q1!=0){
						if(v*op==1)cout<<'+';
						else cout<<'-';
					}
					if(a2==1)cout<<abs(q2);
					else cout<<abs(q2)<<'/'<<a2;
				}
			}
		}else{
			if(q1==0)cout<<"";
			else if(abs(q1)==1&&abs(a1)==1)cout<<q1/a1;
			else if(q1!=1&&a1==1)cout<<q1;
			else if(q1!=1&&a1==-1)cout<<-q1;
			else cout<<q1<<'/'<<a1;
			int op=(q2>0?1:-1);
			if(q1!=0){
				if(v*op==1)cout<<'+';
				else cout<<'-';
			}
			if(abs(q2)==1){
				cout<<"sqrt("<<d<<')';
				if(a2!=1)cout<<'/'<<a2;
			}else{
				if(q1!=0)cout<<abs(q2)<<"*sqrt("<<d<<')';
				else cout<<q2<<"*sqrt("<<d<<')';
				if(a2!=1)cout<<'/'<<a2;
			}
		}
		cout<<endl;
	}
	return 0;
}

回复

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

正在加载回复...