CSP-J 2023 T3luogu 60分求救

#include <bits/stdc++.h>
using namespace std;
bool is_sqrt(int x){
	int p=sqrt(x);
	if(x==p*p){
		return true;
	}
	return false;
}
void f(int t,int a2){
	if(t%a2==0){
		cout<<t/a2;
	}else{
		int q;
		q=t;
		if(t<0){
			t=-t;
		}
		//cout<<t<<" "<<a2;
		int p=__gcd(t,a2);
		t/=p;
		a2/=p;
		if(q<0){
			cout<<"-"<<t<<"/"<<a2;
		}else{
			cout<<t<<"/"<<a2;
		}
					
	}
}
int check_sqrt(int x){
	int sum=1;
	int m=x;
	for(int i=2;i<=sqrt(m);i++){
		if(x%i==0){
			int t=0;
			while(x%i==0){
				x/=i;
				t++;
			}
			if(t>=2){
				while(t>=2){
					t-=2;
					sum*=i;
				}
			}
		}
	}
	return sum;
}
int main(){
	int t,m;
	cin>>t>>m;
	while(t--){
		int a,b,c;
		cin>>a>>b>>c;
		if(a<0) a=-a,b=-b,c=-c;
		int delta=b*b-4*a*c;
		if(delta<0){
			cout<<"NO"<<endl;
			continue;
		}
		if(is_sqrt(delta)==true){
			int s=sqrt(delta);
			int t=-b+s;
			int a2=2*a;
			f(t,a2);
			cout<<endl;
		}else{
			int t=-b;
			int a2=2*a;
			if(t!=0&&a2!=0){
				f(t,a2);
				cout<<"+";
			}
			int l=check_sqrt(delta);
			if(l!=1){
				int z=l*l;
				if(l%a2==0||a2%l==0){
					int p=__gcd(l,a2);
					l/=p;
					a2/=p;
					if(l!=0&&l!=1) cout<<l<<"*";
					cout<<"sqrt("<<delta/z<<")";
					if(a2!=1) cout<<"/"<<a2;
					cout<<endl;
				}else{
					cout<<l<<"*sqrt("<<delta/z<<")";
					cout<<"/"<<a2<<endl;
				}
			}else{
				cout<<"sqrt("<<delta<<")";
				cout<<"/"<<2*a<<endl;
			}
		}
	}
	return 0;
}
1 个赞

我打了3000B也是60(悲)

1 个赞

要考虑 a 是负数,我被这卡了好久

1 个赞

我考虑了呀,if(a<0) a=-a,b=-b,c=-c

1 个赞

我没表示清楚:我的意思是 a 如果是负数可能就会被卡掉

对,所以应该咋改,我这个?