#include <bits/stdc++.h>
using namespace std;
void Change(long long &x,long long &y)
{
//保证分母为正数
if(y<0)
{
x=-x;
y=-y;
}
//约分
long long tmp=__gcd(abs(x),abs(y));
x/=tmp;
y/=tmp;
}
void RealNum(long long x,long long y)
{
//输出实数
Change(x,y);
if(x==0)
{
printf("0");
}
else if(y==1)
{
printf("%lld",x);
}
else
{
printf("%lld/%lld",x,y);
}
}
long long w[1010];//记录质数的桶
void Print(long long q1_x,long long q1_y,long long q2_x,long long q2_y,long long r)
{
//q1_x/q1_y+q2_x/q2_y*sqrt(r)
if(r==0)//如果根号下为零
{
RealNum(q1_x,q1_y);
printf("\n");
return;
}
memset(w,0,sizeof(w));//清空
long long px=r,k=2;//px是r的备份,k是枚举质数
while(px>1)//分解质因数
{
while(px%k==0)
{
px/=k;
w[k]++;
}
k++;//枚举下一个数
}
for(int i=2;i<=1005;i++)
{
while(w[i]>=2)//如果某个质因数个数大等于二
{
q2_x*=i;//前面系数乘以i
r/=i*i;//根号下除以i*i
w[i]-=2;//质因数减二
}
}
//此时为最简根号
Change(q1_x,q1_y);
Change(q2_x,q2_y);
if(r==1)//如果是根号1,不用根号
{
long long xx=q1_x*q2_y+q1_y*q2_x;
long long yy=q1_y*q2_y;
RealNum(xx,yy);
printf("\n");
return;
}
if(q1_x!=0)//如果前面部分不为零
{
RealNum(q1_x,q1_y);
printf("+");
}
//处理根号
if(q2_x==1&&q2_y==1)
{
printf("sqrt(%lld)",r);
}
else if(q2_y==1)
{
printf("%lld*sqrt(%lld)",q2_x,r);
}
else if(q2_x==1)
{
printf("sqrt(%lld)/%lld",r,q2_y);
}
else
{
printf("%lld*sqrt(%lld)/%lld",q2_x,r,q2_y);
}
printf("\n");//换行
}
int main()
{
// freopen("uqe.in","r",stdin);
// freopen("uqe.out","w",stdout);
long long T,M;
scanf("%lld %lld",&T,&M);
while(T--)
{
long long a,b,c;
scanf("%lld %lld %lld",&a,&b,&c);
long long dt=b*b-4*a*c;
if(dt<0)//判别式小于零
{
printf("NO\n");
}
else if(dt==0)//等于零
{
RealNum(-b,a*2);
printf("\n");
}
else//大于零
{
double tx1=(-b+sqrt(dt))/(a*2);
double tx2=(-b-sqrt(dt))/(a*2);
if(tx1>tx2)//判断哪个根大
{
Print(-b,a*2,1,a*2,dt);
}
else
{
Print(-b,a*2,-1,a*2,dt);
}
}
}
return 0;
}
求助为什么 RE.