2023CSP-J3 10pts求调
  • 板块学术版
  • 楼主openwld
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/10/22 10:15
  • 上次更新2023/11/2 11:59:47
查看原帖
2023CSP-J3 10pts求调
402402
openwld楼主2023/10/22 10:15
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
ll T, M;

ll gcd(ll a, ll b) {
	if(a < b) swap(a, b);
	if(a%b == 0) return b;
	return gcd(b, a%b);
}

ll abss(ll x) {return (x<0?-x:x);}

int main() {
	freopen("uqe.in", "r", stdin);
	freopen("uqe.out", "w", stdout);
	cin >> T >> M;
	while(T--) {
		ll a, b, c;
		cin >> a >> b >> c;
		if(a < 0) {
			a*=-1;b*=-1;c*=-1;
		}
		ll delta = b*b-4*a*c;
		if(delta < 0) {
			cout << "NO" << endl;
		    continue;
		}
		ll q1u = -b;
		ll q1d = 2*a;
		ll q2u = 1;
		ll q2d = 2*a;
		ll dd = delta;
		for(ll i = 1; i*i <= dd; i++) {
			if(delta%(i*i) == 0) {
				delta /= i*i;
				q2u *= i;
			}
		}
		if(delta == 1) {
			q1u += q2u;
			q2u = 0;
		}
		if(delta == 0) q2u = 0;
		if(q1u != 0) {
			ll g = gcd(abss(q1u), abss(q1d));
			q1u /= g; q1d /= g;
			if(q1d < 0) q1u *= -1,q1d *= -1;
			cout << q1u;
			if(q1d != 1) cout << "/" << q1d;
			if(q2u != 0) cout << "+";
		}
		if(q1u == 0 && q2u == 0) {
			cout << "0" << endl;
			continue;
		}
		if(q2u != 0 && delta != 0) {
			ll g = gcd(abss(q2u), abss(q2d));
			q2u /= g; q2d /= g;
			if(q2d < 0) q2u *= -1,q2d *= -1;
			if(q2u != 1) cout << q2u << "*";
			cout << "sqrt(" << delta << ")";
			if(q2d != 1) cout << "/" << q2d;
		}
		cout << endl;
	}
	return 0;
}

模拟题,思路应该还算清晰。gcd没挂

2023/10/22 10:15
加载中...