J组T3洛谷RE90求助
  • 板块学术版
  • 楼主ISTP
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/10/21 15:27
  • 上次更新2023/11/2 12:14:44
查看原帖
J组T3洛谷RE90求助
528540
ISTP楼主2023/10/21 15:27

是爆数组了还是除 0 之类的?小图灵 RE80,前两题确认AC,坐标 ZJ 能稳 1= 吗?

code:

#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;
}

2023/10/21 15:27
加载中...