题目链接:P9750 [CSP-J 2023] 一元二次方程
最近一次结果:TLE
代码
#include<bits/stdc++.h>
#include<math.h>
#define max(x, y) (x > y? x : y)
#define min(x, y) (x < y? x : y)
//#define lowbit(x) (x & -x)
using namespace std;
int kaifang[5000010];
void init() {
for(int i = 1; i < 2236; i++) {
for(int j = i * i; j < (i + 1) * (i + 1); j++) {
kaifang[j] = i;
}
}
for(int i = 4999696; i <= 5000000; i++) {
kaifang[i] = 2236;
}
}
struct value_in_math {
//用结构体存数据
//假如输出为:a/b+c*sqrt(d)/e
int _1fenzi1;//a
int _2fenmu1;//b
int _3fenzi2xishu;//c
int _4fenzi2;//d
int _5fenmu2;//e
} ans;
int gcd(int x, int y) {
if(y) return gcd(y, x % y);
else return x;
}
int g;
void write() { //输出
if(ans._1fenzi1) {
printf("%d", ans._1fenzi1);
if(ans._2fenmu1 != 1) printf("/%d", ans._2fenmu1);
}
if(ans._3fenzi2xishu && ans._4fenzi2) {
if(ans._1fenzi1 != 0) {
if(ans._3fenzi2xishu > 0) printf("+");
}
if(ans._3fenzi2xishu == -1) printf("-");
if(abs(ans._3fenzi2xishu) != 1) printf("%d*", ans._3fenzi2xishu);
printf("sqrt(%d)", ans._4fenzi2);
if(ans._5fenmu2 != 1) printf("/%d", ans._5fenmu2);
}
if(ans._1fenzi1 == 0 && (ans._3fenzi2xishu == 0 || ans._4fenzi2 == 0)) printf("0");
printf("\n");
}
int fm1;
value_in_math huajian() { //化简
//假设结果有两项相加组成,一项为有理数,一项为无理数
if(ans._3fenzi2xishu) { //若有无理数项
if(ans._5fenmu2 < 0) { //若其分母小于零
ans._3fenzi2xishu *= -1;
ans._5fenmu2 *= -1;
}
for(int i = kaifang[ans._4fenzi2]; i >= 2; i--) { //提取根号下的完全平方因子
if(ans._4fenzi2 % (i * i) == 0) {
ans._3fenzi2xishu *= i;
ans._4fenzi2 /= i * i;
break;
}
}
g = gcd(abs(ans._3fenzi2xishu), abs(ans._5fenmu2)); //对无理数项进行约分
ans._3fenzi2xishu /= g;
ans._5fenmu2 /= g;
}
if(ans._2fenmu1 < 0) { //若有理数项分母为负
ans._1fenzi1 *= -1;
ans._2fenmu1 *= -1;
}
if(ans._4fenzi2 == 1 && ans._3fenzi2xishu != 0) { //若无理数项根号下为1,则合并两项
fm1 = ans._2fenmu1;
g = gcd(ans._2fenmu1, ans._5fenmu2);
ans._1fenzi1 *= ans._5fenmu2 / g;
ans._2fenmu1 *= ans._5fenmu2 / g;
ans._3fenzi2xishu *= fm1 / g;
ans._5fenmu2 *= fm1 / g;
ans._1fenzi1 += ans._3fenzi2xishu;
ans._3fenzi2xishu = 0;
}
g = gcd(abs(ans._1fenzi1), abs(ans._2fenmu1)); //对有理数项进行约分
ans._1fenzi1 /= g;
ans._2fenmu1 /= g;
}
int T, M;
int a, b, c, deltarune;
signed main() {
// freopen("uqe.in","r",stdin);
// freopen("uqe.out","w",stdout);
init();
cin >> T >> M;
while(T--) {
scanf("%d%d%d", &a, &b, &c);
ans._1fenzi1 = 0;
ans._2fenmu1 = 1;
ans._3fenzi2xishu = 0;
ans._4fenzi2 = 0;
ans._5fenmu2 = 1;
deltarune = b * b - 4 * a * c;
if(deltarune < 0) { //实数根
printf("NO\n");
continue;
}
if(b == 0) { //特殊性质a(因式分解法)
if(a < 0) ans._3fenzi2xishu = -1;
else ans._3fenzi2xishu = 1;
ans._1fenzi1 = 0;
ans._4fenzi2 = c * (-1) * a;
ans._5fenmu2 = a;
} else if(c == 0) {//特殊性质b(平方差公式)
if(a * b < 0) {
ans._1fenzi1 = -b;
ans._2fenmu1 = a;
}
} else if(deltarune == 0) { //有俩相等实数根
ans._3fenzi2xishu = 0;
ans._2fenmu1 = 2 * a;
ans._1fenzi1 = b * (-1);
} else { //有俩不等实数根
if(a < 0) ans._3fenzi2xishu = -1;
else ans._3fenzi2xishu = 1;
ans._4fenzi2 = deltarune;
ans._5fenmu2 = 2 * a;
ans._2fenmu1 = 2 * a;
ans._1fenzi1 = b * (-1);
}
huajian(); //化简
write(); //输出
}
return 0;
}
救救蒟蒻吧