社区讨论

求调!!!马风良好,可互关!!!

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

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@mhj3sukz
此快照首次捕获于
2025/11/03 20:15
4 个月前
此快照最后确认于
2025/11/03 20:15
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,a,b,c,delta;
int ti(int x) {
	if(x==0) return 0;
	int f=sqrt(x);
	if(f*f==x) return f;
	int ma=1;
	for(int i=2; i*i<=x; i++)
		if(x%(i*i)==0) ma=i;
	return ma;
}
signed main() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {
		scanf("%d%d%d",&a,&b,&c);
		delta=b*b-4*a*c;
		if(delta<0) printf("NO\n");
		else {
			int x=__gcd(-b,2*a);
			int a1=2*a,b1=b*(-1);
			a1/=x;
			b1/=x;
			if(a1<0) a1*=-1,b1*=-1;
			int d=ti(delta);
			if(d==0) {
				if(b1==0) printf("0\n");
				else if(a1==1) printf("%d\n",b1);
				else printf("%d/%d\n",b1,a1);
				continue;
			}
			delta/=d*d;
			if(delta==1) {
				int a2=a*2;
				int x1=__gcd(a2,d);
				a2/=x1,d/=x1;
				if(a2<0) a2*=-1,d*=-1;
				if(a2==1){
					if(b1==0) printf("%d\n",d);
					else if(a1==1) printf("%d\n",d+b1);
					else printf("%d/%d+%d\n",b1,a1,d);
				}
				else{
					int t=__gcd(a1,a2),h=a1*a2/t;
					b1*=h/a1,d*=h/a2;
					int h1=__gcd(b1+d,h);
					h/=h1;
					int ans=b1+d;
					ans/=h1;
					if(h<0) h*=-1,ans*=-1;
					if(h==1) printf("%d\n",ans);
					else printf("%d/%d\n",ans,h);
				}
			} else {
				int a2=a*2;
				int x1=__gcd(a2,d);
				a2/=x1,d/=x1;
				if(a2<0) a2*=-1,d*=-1;
				if(a2==1){
					if(a1==1){
						if(d==1) b1!=0?printf("%d+sqrt(%d)\n",b1,delta):printf("sqrt(%d)\n",delta);
						else b1!=0?printf("%d+%d*sqrt(%d)\n",b1,d,delta):printf("%d*sqrt(%d)\n",d,delta);
					}
					else{
						if(d==1) b1!=0?printf("%d/%d+sqrt(%d)\n",b1,a1,delta):printf("sqrt(%d)\n",delta);
					    else b1!=0?printf("%d/%d+%d*sqrt(%d)\n",b1,a1,d,delta):printf("%d*sqrt(%d)\n",d,delta);
					}
				}
				else{
					if(a1==1){
						if(d==1) b1!=0?printf("%d+sqrt(%d)/%d\n",b1,delta,a2):printf("sqrt(%d)/%d\n",delta,a2);
						else b1!=0?printf("%d+%d*sqrt(%d)/%d\n",b1,d,delta,a2):printf("%d*sqrt(%d)/%d\n",d,delta,a2);
					}
					else{
						if(d==1) b1!=0?printf("%d/%d+sqrt(%d)/%d\n",b1,a1,delta,a2):printf("sqrt(%d)/%d\n",delta,a2);
						else b1!=0?printf("%d/%d+%d*sqrt(%d)/%d\n",b1,a1,d,delta,a2):printf("%d*sqrt(%d)/%d\n",d,delta,a2);
					}
				}
			}
		}
	}
	return 0;
}

回复

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

正在加载回复...