50pts求助(玄关)
查看原帖
50pts求助(玄关)
1038710
AutumnQ楼主2023/11/26 11:13

记录

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll T,m;
ll a,b,c,delta;
void print_no_ans(){
	printf("NO\n");
}
inline ll gcd(ll a,ll b){
	if(b==0)return a;
	return gcd(b,a%b);
}
inline ll abss(ll a){
	if(a>=0)return a;
	return -a;
}
void print_ans(int fz,int fm){
	ll gcdd=gcd(abss(fz),abss(fm));
	fz/=gcdd;
	fm/=gcdd;
	if(fm<0)fz*=-1,fm*=-1;
	if(fm==1)printf("%lld\n",fz);
	else printf("%lld/%lld\n",fz,fm);
}
void print_sqrt(ll sq,ll fz,ll fm){
	ll ggcd=gcd(abss(fz),abss(fm));
	fz/=ggcd;
	fm/=ggcd;
	if(fm<0)fz*=-1,fm*=-1;
	if(fz){
		if(fm==1)printf("%lld+",fz);	
		else printf("%lld/%lld+",fz,fm);
	}
	fm=abss(2*a);
	fz=1;
	ll sqr=0;
	for(ll i=sq;i>=1;i--){
		if(delta%(i*i)==0){
			fz*=i;
			sqr=delta/(i*i);
			break;
		}
	}
	ggcd=gcd(abs(fz),abs(fm));
	fz/=ggcd;
	fm/=ggcd;
	if(fm<0)fm*=-1,fz*=-1;
	if(fz==fm) {
		printf("sqrt(%lld)\n",sqr);
		return;
	}
	if(fm==1){
		printf("%lld*sqrt(%lld)\n",fz,sqr);
		return;
	}
	if(fz==1){
		printf("sqrt(%lld)/%lld\n",sqr,fm);
		return;
	}
	printf("%lld*sqrt(%lld)/%lld\n",fz,sqr,fm);
}
int main(){
	scanf("%lld%lld",&T,&m);
	while(T--){
		scanf("%lld%lld%lld",&a,&b,&c);
		delta=b*b-4*a*c;
		if(delta<0){
			print_no_ans();
			continue;
		}
		if(delta==0){
			print_ans(-b,2*a);
			continue;
		}
		ll fzz=-b,fmm=2*a;
		ll sq=(ll)sqrt(delta);
		if(sq*sq==delta){
			if(fmm>0)fzz+=sq;
			else fzz-=sq;
			print_ans(fzz,fmm);
			continue;
		}
		print_sqrt(sq,fzz,fmm);
	}
}
2023/11/26 11:13
加载中...