考场代码,大样例没看完,但看过的都能对上。
#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
*/