T3 90分求助
  • 板块题目总版
  • 楼主CNS_5t0_0r2
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/22 16:59
  • 上次更新2023/11/2 11:52:04
查看原帖
T3 90分求助
999274
CNS_5t0_0r2楼主2023/10/22 16:59
#include<bits/stdc++.h>
using namespace std;
int GCD(int x,int y){
	return y ? GCD(y,x % y) : x;
}
int t,m;
int a,b,c;
int DIV[1009];
int divisor(int x){
	int ret = 1;
	memset(DIV,0,sizeof DIV);
	while(!(x & 1)){
		x >>= 1;
		DIV[2]++;
		if(DIV[2] == 2){
			ret <<= 1;
			DIV[2] = 0;
		}
	}
	for(int i = 3;i * i <= x;i += 2){
		while(!(x % i)){
			x /= i;
			DIV[i]++;
			if(DIV[i] == 2){
				ret *= i;
				DIV[i] = 0;
			}
		}
	}
	return ret;
}
int main(){
	//freopen("uqe.in","r",stdin);
	//freopen("uqe.out","w",stdout);
	scanf("%d%d", &t, &m);
	for(;t;t--){
		scanf("%d%d%d", &a, &b, &c);
		if(a < 0){
			a = -a;b = -b;c = -c;
		}
		int delta = b * b - ((a * c) * 4);
		if(delta < 0)
			printf("NO\n");
		else{
			a *= 2;
			int g = GCD(abs(a),abs(b));
			if(delta == 0){
				a /= g;
				b /= g;
				if(a == 1)
					printf("%d\n",-b);
				else if(a == -1)
					printf("%d\n",b);
				else if(a < 0)
					printf("%d/%d\n",b,-a);
				else if(a > 0)
					printf("%d/%d\n",-b,a);
			}
			else if(delta != 0){
				int x = divisor(delta);
				int y = delta / (x * x);
				if(y == 1){
					int b1,b2;
					b1 = -b + x;
					b2 = -b - x;
					int g1 = GCD(abs(a),abs(b1));
					int g2 = GCD(abs(a),abs(b2));
					if(a < 0){
						int B;
						if(b1 < b2){
							a /= g1;
							B = b1 / g1;
						}
						else{
							a /= g2;
							B = b2 / g2;
						}
						if(a == -1)
							printf("%d\n",-B);
						else
							printf("%d/%d\n",-B,-a);
					}
					else if(a > 0){
						int B;
						if(b1 > b2){
							a /= g1;
							B = b1 / g1;
						}
						else{
							a /= g2;
							B = b2 / g2;
						}
						if(a == 1)
							printf("%d\n",B);
						else
							printf("%d/%d\n",B,a);
					}
				}
				else{
					int A = a / g;
					b /= g;
					bool check = false;
					if(b){
						if(A == 1)
							printf("%d",-b);
						else if(A == -1)
							printf("%d",b);
						else if(A < 0)
							printf("%d/%d",b,-A);
						else if(A > 0)
							printf("%d/%d",-b,A);
						check = true;
					}
					int G = GCD(abs(x),abs(a));
					A = a / G;
					x /= G;
					if(A == 1){
						if(x > 0 && check)
							printf("+");
						if(x != 1)
							printf("%d*",x);
						printf("sqrt(%d)\n",y);
					}
					else if(A == -1){
						x = -x;
						if(x > 0 && check)
							printf("+");
						if(x != 1)
							printf("%d*",x);
						printf("sqrt(%d)\n",y);
					}
					else if(A < 0){
						A = -A;
						x = -x;
						if(x > 0 && check)
							printf("+");
						if(x != 1)
							printf("%d*",x);
						printf("sqrt(%d)/%d",y,A);
						printf("\n");
					}
					else if(A > 0){
						A = A;
						if(check)
							printf("+");
						if(x != 1)
							printf("%d*",x);
						printf("sqrt(%d)/%d",y,A);
						printf("\n");
					}
				}
			}
		}
	}
	return 0;
}
2023/10/22 16:59
加载中...