csp-j T3 30分求调(悬关)
  • 板块学术版
  • 楼主9gehetao
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/22 21:59
  • 上次更新2023/11/2 11:46:58
查看原帖
csp-j T3 30分求调(悬关)
600143
9gehetao楼主2023/10/22 21:59
#include<bits/stdc++.h>
using namespace std;
long long gcd(long long o,long long v){
	if(!v) return o;
	return gcd(v,o%v);
}
int main(){
	long long T,M;
	cin>>T>>M;
	while(T--){
		long long a,b,c;
		cin>>a>>b>>c;
		if(b*b-4*a*c <0){
			puts("NO");
			continue;
		}
		if(a<0) a=-a,b=-b,c=-c;
		long long l=sqrt(b*b-4*a*c);
		if(l*l==b*b-4*a*c){
		    long long p=-b+l,q=2*a,g=gcd(p,q);
			p/=g,q/=g;
			if(p==0) puts("0");
			if(q==1) printf("%d\n",p);
			else{
				if(M*p*q<0) p=-abs(p),q=abs(q);
				else  p=abs(p),q=abs(q);
				printf("%d/%d\n",p,q);
			}
		}
		else{
			long long p=-b,q=2*a,g=gcd(p,q);
			bool flag=0;
			p/=g,q/=g;
			if(p!=0){
				if(q==1) printf("%d",p);
				else{
					if(M*p*q<0)p=-abs(p),q=abs(q);
					else p=abs(p),q=abs(q);
					printf("%d/%d",p,q);
				}
			}
			else flag=1;
			int k=b*b-4*a*c;
			p=1;
			for(int i=2;i*i<=k;i++)
			while(k%(i*i)==0)
			p*=i,k/=(i*i);
			assert(k!=1);
			q=2*a,g=gcd(p,q);
			p/=g,q/=g;
			if(p!=0){
				if(M*p*q<0) p=-abs(p),q=abs(q),assert(0);
				else{
					if(!flag) putchar('+');
					p=abs(p),q=abs(q);
				}
				if(q==1&&p==1) printf("sqrt(%d)\n",k);
				else  if(q==1) printf("%d*sqrt(%d)\n",p,k);
				else  if(p==1) printf("sqrt(%d)/%d\n",k,q);
				else  printf("%d*sqrt(%d)/%d\n",p,k,q);
			}
			else  assert(0),puts("");
		}
	}
	return 0;
}
2023/10/22 21:59
加载中...