洛谷-j t3 50pts求助
  • 板块灌水区
  • 楼主luo_xiaoran
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/10/22 15:25
  • 上次更新2023/11/2 11:53:33
查看原帖
洛谷-j t3 50pts求助
605945
luo_xiaoran楼主2023/10/22 15:25

考场代码,大样例没看完,但看过的都能对上。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll t,m;
ll sqt(ll x){
	for(ll i=(ll)sqrt(x);i>=2;i--)
		if(!(x%(i*i))) return i;
	return 1;
}
int main(){
//	freopen("uqe.in","r",stdin);
//	freopen("uqe.out","w",stdout);
	scanf("%lld%lld",&t,&m);
	while(t--){
		ll a,b,c;
		scanf("%lld%lld%lld",&a,&b,&c);
		if(b*b-4*a*c<0){
			printf("NO\n");
			continue;
		}
		ll st=(ll)sqrt((b*b-4*a*c));
		if(a<0) st=-st;
		if(st*st==b*b-4*a*c){
			st-=b;
			ll gd=__gcd(abs(st),abs(a*2));
			if(gd==abs(a*2))
				if(st/(a*2)<0) printf("-%lld\n",(abs(st)/abs(a*2)));
				else printf("%lld\n",(st/(a*2)));
			else
				if(max(st,a*2)/min(st,a*2)<0) printf("-%lld/%lld\n",(abs(st)/gd),(abs(2*a)/gd));
				else printf("%lld/%lld\n",(st/gd),(2*a/gd));
		}
		else{
			if(b){
				ll gd=__gcd(abs(b),abs(a*2));
				if(gd==abs(a*2))
					if((-b)/(a*2)<0) printf("-%lld+",abs(b)/abs(a*2));
					else printf("%lld+",(-b)/(a*2));
				else
					if(max(-b,a*2)/min(-b,a*2)<0) printf("-%lld/%lld+",(abs(b)/gd),(abs(2*a)/gd));
					else printf("%lld/%lld+",((-b)/gd),(2*a/gd));
			}
			ll o=sqt((b*b-4*a*c)),h=b*b-4*a*c,a_2=abs(a*2),kk=__gcd(a_2,o);
			h/=(o*o);
			o/=kk;
			if(kk==a_2)
				if(o==1) printf("sqrt(%lld)\n",h);
				else printf("%lld*sqrt(%lld)\n",o,h);
			else
				if(o==1) printf("sqrt(%lld)/%lld\n",h,(a_2/kk));
				else printf("%lld*sqrt(%lld)/%lld\n",o,h,(a_2/kk));
		}
	}
	return 0;
}
/*
9 1000
1 -1 0
-1 -1 -1
1 -2 1
1 5 4
4 4 1
1 0 -432
1 -3 1
2 -4 1
1 7 1
*/
2023/10/22 15:25
加载中...