求助,本地AC锣鼓TLE
  • 板块灌水区
  • 楼主THM200000000
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/10/20 10:21
  • 上次更新2024/10/20 12:04:06
查看原帖
求助,本地AC锣鼓TLE
1405997
THM200000000楼主2024/10/20 10:21

题目链接: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;
}

救救蒟蒻吧

2024/10/20 10:21
加载中...