社区讨论

求助 急!!!

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@m1m6d4cf
此快照首次捕获于
2024/09/28 21:15
去年
此快照最后确认于
2025/11/04 18:33
4 个月前
查看原帖

超绝模拟

谢谢帮查

CPP
#include<bits/stdc++.h>
using namespace std;
int T,M;
int a,b,c,d;
int gcd(int m,int n){
	if(m%n==0) return n;
	return gcd(n,m%n);
}
bool isqrt(int a){
	for(int i=sqrt(a)+2;i>=sqrt(a)-2;i--){
		if(i*i==a) return 1;
	}
	return 0;
}
int xs(int a){
	int sum=1,e=a; 
	for(int i=a;i>=1&&e!=1;i--){
		if(isqrt(i)&&a%i==0){	
			sum*=sqrt(i);
			e/=i;
		}
	}
	return sum;
}
int bkfs(int a){
	int e=a; 
	for(int i=a;i>=1&&e!=1;i--) if(isqrt(i)&&a%i==0) e/=i;
	return e;
}
void step1(int a,int b,int c,int d){
	int sum=gcd(-b,2*a);
	int p=-b/sum,q=(2*a)/sum;
	if(q==1) printf("%d\n",p);
	else{
		if(q<0) printf("%d/%d\n",-p,-q);
		else printf("%d/%d\n",-p,-q);
	} 
}
void step2(int a,int b,int c,int d){
	if(isqrt(d)){
		d=sqrt(d);
		int p=-b+d,q=2*a;
		int sum=gcd(p,q);
		p/=sum;
		q/=sum;
		if(q==1) printf("%d\n",p);
		else{
			if(q<0) printf("%d/%d\n",-p,-q);
			else printf("%d/%d\n",-p,-q);
		} 
	}
	else{
		int q=2*a,p1=-b,p2=xs(d),p3=bkfs(d),qq=2*a;
		if(p1){
			int sum=gcd(q,p1),sumq=q;
			p1/=sum;
			sumq/=q;
			if(sumq==1) printf("%d+",p1);
			else{
				if(q<0) printf("%d/%d\n",-p1,-q);
				else printf("%d/%d\n",-p1,-q);
			} 
		}
		int sum=gcd(p2,qq);
		p2/=sum;
		qq/=sum;
		if(p2==qq&&qq==1) printf("sqrt(%d)\n",p3);
		else if(qq==1) printf("%d*sqrt(%d)\n",p2,p3);
		else if(p2==1) printf("sqrt(%d)/%d\n",p3,p2);
		else printf("%d*sqrt(%d)/%d\n",p2,p3,qq);
	}
}
int main(){
	scanf("%d%d",&T,&M);
	for(int i=1;i<=T;i++){
		scanf("%d%d%d",&a,&b,&c);
		d=b*b-4*a*c;
		if(d<0) printf("NO\n");
		else if(d==0) step1(a,b,c,d);
		else step2(a,b,c,d);
	}
	return 0;
} 

回复

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

正在加载回复...