社区讨论

@ronan2

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

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@mm7mk707
此快照首次捕获于
2026/03/01 18:46
上周
此快照最后确认于
2026/03/01 18:59
上周
查看原帖
CPP
#include <bits/stdc++.h>


using namespace std;

int T, M, gt;

int gcd(int a, int b) {
	if (b == 0) return a;
	else return gcd(b, a % b);
}

int main() {
	scanf("%d%d", &T, &M);
	while (T--) {
		int a, b, c;
		scanf("%d%d%d", &a, &b, &c);
		if (a < 0) a = -a, b = -b, c = -c; 
		int d = b * b - 4 * a * c;
		if (d < 0) { 
			printf("NO\n");
			continue;
		}
		int f = 1, i = 2;
        
		while (i * i <= d) {
			while (d % (i * i) == 0) {
				f *= i, d /= (i * i);
			}
			i++;
		}
		if (d == 0 || d == 1) { 
			gt = abs(gcd(-b + f * d, 2 * a)); 
			printf("%d", (-b + f * d) / gt);
			if (2 * a / gt != 1) 
				printf("/%d", 2 * a / gt);
			printf("\n");
		}
		else { 
			gt = abs(gcd(-b, 2 * a));
			if (-b / gt != 0) 
				printf("%d", -b / gt);
			if (2 * a / gt != 1) 
				printf("/%d", 2 * a / gt);
			if (-b / gt != 0)
				printf("+");
			gt = abs(gcd(f, 2 * a));
			if (f / gt != 1) printf("%d*", f / gt); 
			printf("sqrt(%d)", d);
			if (2 * a / gt != 1) printf("/%d", 2 * a / gt);
			printf("\n");
		}
	}
	return 0;
}

回复

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

正在加载回复...