RT
评测记录评测记录
代码如下
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int qread() {
int ans=0;
bool f=0;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') {
f=1;
}
c=getchar();
}
while(c>='0'&&c<='9') {
ans=ans*10+c-'0';
c=getchar();
}
if(f) {
return -ans;
} else {
return ans;
}
}
inline ll gcd(ll a,ll b) {
ll t;
while(b>0) {
t=a;
a=b;
b=t%a;
}
return a;
}
bool vis[1010000];
int z[101000],zs;
inline void gz(int n) {
for(int i=2; i<=n; i++) {
if(!vis[i]) {
z[zs++]=i;
}
for(int j=0; i*z[j]<=n&&j<zs; j++) {
vis[i*z[j]]=1;
}
}
}
struct F {
ll h,d;
bool f;
void yf() {
ll g=gcd(h,d);
h/=g,d/=g;
}
void print() {
if(f) {
putchar('-');
}
printf("%lld/%lld\n",h,d);
}
};
inline F nf(ll h,ll d) {
bool f;
if((h<0&&d<0)||(h>=0&&d>0)) {
f=0;
} else {
f=1;
}
F fs;
fs.h=llabs(h),fs.d=llabs(d),fs.f=f;
return fs;
}
int t,m;
ll a,b,c;
int main() {
// freopen("uqe.in","r",stdin);
// freopen("uqe.out","w",stdout);
gz(100000);
// for(int i=0; i<100; i++) {
// printf("%d\n",z[i]);
// }
// return 0;
t=qread(),m=qread();
while(t--) {
// putchar('\n');
a=qread(),b=qread(),c=qread();
ll d=b*b-4*a*c;
if(d<0) {
printf("NO\n");
continue;
}
ll x=-b,y=1;
for(int i=0; i<zs; i++) {
ll zn=z[i];
ll p=zn*zn;
if(d<p) {
break;
}
while(d%p==0) {
d/=p;
y*=zn;
}
}
F q1= nf(x,2*a),q2= nf(y,2*a);
q1.yf(),q2.yf();
if(a<0) {
q2.f=!q2.f;
}
// printf("\nDebug :\n");
// printf("q1 = ");
// q1.print();
// printf("q2 = ");
// q2.print();
// printf("d = %lld\n",d);
if(d==1) {
F ans;
// printf("h : %lld , d : %lld\n",q1.h*q2.d+q1.d*q2.h,q1.d*q2.d);
if(q1.f==0&&q2.f==1) {
ans=nf(q1.h*q2.d-q1.d*q2.h,q1.d*q2.d);
ans.f=q1.h*q2.d-q1.d*q2.h<0;
} else if(q1.f==1&&q2.f==0) {
ans=nf(-q1.h*q2.d+q1.d*q2.h,q1.d*q2.d);
ans.f=-q1.h*q2.d+q1.d*q2.h<0;
} else {
ans=nf(q1.h*q2.d+q1.d*q2.h,q1.d*q2.d);
ans.f=q1.f;
}
ans.yf();
if(ans.f) {
putchar('-');
}
printf("%lld",ans.h);
if(ans.d!=1) {
printf("/%lld",ans.d);
}
putchar('\n');
continue;
}
if(q1.h>0) {
if(q1.f) {
putchar('-');
}
printf("%lld",q1.h);
if(q1.d!=1) {
printf("/%lld",q1.d);
}
}
if(d==0) {
putchar('\n');
continue;
}
if(q1.h>0&&q2.f==0) {
putchar('+');
}
if(q2.f) {
putchar('-');
}
if(q2.h>1) {
printf("%lld",q2.h);
}
if(d>1) {
if(q2.h>1) {
putchar('*');
}
printf("sqrt(%lld)",d);
}
if(q2.d>1) {
printf("/%lld",q2.d);
}
putchar('\n');
}
return 0;
}