社区讨论

J组T3洛谷RE90求助

学术版参与者 3已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@lo0utumf
此快照首次捕获于
2023/10/22 10:33
2 年前
此快照最后确认于
2023/11/02 12:14
2 年前
查看原帖
是爆数组了还是除 0 之类的?小图灵 RE80,前两题确认AC,坐标 ZJ 能稳 1= 吗?
code:
CPP
#include <bits/stdc++.h>
using namespace std;
void solve(int, int, int, int);
int cclt(int, bool);
int main(){
	freopen("uqe.in", "r", stdin);
	freopen("uqe.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int T, M;
	cin >> T >> M;
	while(T --){
		int a, b, c;
		cin >> a >> b >> c;
		int dlt = b * b - 4 * a * c;
		if(dlt < 0) cout << "NO\n";
		else solve(a, b, c, dlt);
	}
	return 0;
}
void solve(int a, int b, int c, int dlt){
	bool opdlt;
	double r1 = (1.0 * (-b) - dlt) / (2 * a);
	double r2 = (1.0 * (-b) + dlt) / (2 * a);
	opdlt = r1 > r2? 0: 1;
	int sdlt = sqrt(dlt);
	if(sdlt * sdlt == b * b - 4 * a * c){
		int u = opdlt? (-b) + sdlt: (-b) - sdlt;
		int d = 2 * a;
		int mod = __gcd(abs(u), abs(d));
		u /= mod, d /= mod;
		if(u < 0 && d < 0) u = (-u), d = (-d);
		if(u > 0 && d < 0) u = (-u), d = (-d);
		if(u % d == 0) cout << u / d << '\n';
		else cout << u << '/' << d << '\n';
	}
	else{
		int m = cclt(dlt, 1), n = cclt(dlt, 0);
		int u1 = (-b), d1 = 2 * a;
		int u2 = opdlt? m: (-m), d2 = 2 * a;
		int mod1 = __gcd(abs(u1), abs(d1));
		int mod2 = __gcd(abs(u2), abs(d2));
		u1 /= mod1, d1 /= mod1;
		if(u1 < 0 && d1 < 0) u1 = (-u1), d1 = (-d1);
		if(u1 > 0 && d1 < 0) u1 = -(u1), d1 = (-d1);
		if(u1){
			if(u1 % d1 == 0) cout << u1 << '+';
			else cout << u1 << '/' << d1 << '+';
		}
		u2 /= mod2, d2 /= mod2;
		if(u2 < 0 && d2 < 0) u2 = -(u2), d2 = -(d2);
		if(u2 > 0 && d2 < 0) u2 = -(u2), d2 = -(d2);
		if(u2 % d2 == 0){
			if(u2 == 1) cout << "sqrt(" << n << ")\n";
			else cout << (u2 / d2) << "*sqrt(" << n << ")\n";
		}
		else if(d2 % u2 == 0){
			if(d2 == 1) cout << "sqrt(" << n << ")\n";
			else cout << "sqrt(" << n << ")/" << (d2 / u2) << '\n';
		}
		else cout << u2 << "*sqrt(" << n << ")/" << d2 << '\n';
	}
	return ;
}
int cclt(int dlt, bool f){
	int m = 1, n = dlt, k = 2;
	while(dlt > 1){
		while(dlt % (k * k) == 0) m *= k, dlt /= k * k, n /= k * k;
		while(dlt % k == 0) dlt /= k;
		k ++;
	}
	if(f) return m;
	return n;
}

回复

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

正在加载回复...