社区讨论

CSP-J T3正(歪?)解

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lo0uu2y7
此快照首次捕获于
2023/10/22 10:33
2 年前
此快照最后确认于
2023/11/02 12:14
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
struct num{
	int p,q;
	void yue(){
		if(q<0){
			q*=-1,p*=-1;
		}
		int t=abs(__gcd(p,q));
		p/=t,q/=t;
		return ;
	}
	void printnum(){
		if(p==q)cout << 1;
		else if(q==1)cout << p;
		else cout << p << '/' << q;
		return;
	}
};
struct root{
	num q1,q2;
	int gen;
	void get(){
		for(int i=2;i*i<=gen;i++){
			while(gen%(i*i)==0){
				gen/=(i*i);
				q2.p*=i;
			}
		}
		q2.yue();
	}
	void printroot(){
		if(q2.p==q2.q)cout << "sqrt(" << gen << ")";
		else if(q2.q==1)cout << q2.p << "*sqrt(" << gen << ")";
		else if(q2.p==1)cout << "sqrt(" << gen << ")/" << q2.q;
		else cout << q2.p << "*sqrt(" << gen << ")/" << q2.q;
		cout << endl;
	}
};
void solve(){
	int a,b,c;
	cin >> a >> b >> c;
	int del=b*b-(4*a*c);
	if(del<0){
		cout << "NO" << endl;
		return;
	}
	if((int)(sqrt(del))*(int)(sqrt(del))==del){
		num ans;
		if((0-b+(int)(sqrt(del))*1.0)/(2*a)>(0-b-(int)(sqrt(del))*1.0)/(2*a)){
			ans.p = 0-b+sqrt(del);
		}else{
			ans.p = 0-b-sqrt(del);
		}
		ans.q=2*a;
		ans.yue();
		ans.printnum();
		cout <<endl;
		return;
	}
	root x;
	x.q1.p=-b;
	x.q1.q=2*a;
	x.q1.yue() ;
	x.q2.q = 2*a;
	x.gen = del;
	if((0-b+(sqrt(del))*1.0)/(2*a)>(0-b-(sqrt(del))*1.0)/(2*a)){
		x.q2.p = 1;
	}else{
		x.q2.p = -1;
	}
	x.get();
	if(x.q1.p!=0){
		x.q1.printnum();
		cout << '+';
	}
	x.printroot();
	return;
}
int q,m;
int main(){
	cin >> q >> m;
	while(q--){
		solve();
	}
	return 0;
} 

回复

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

正在加载回复...