大小样例都过了。
巨丑的代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,m,p,q,csp=1;
bool pd(double x){
int cnt;
if(x<0)x=-x;
cnt=(int)(x)*(int)(x);
if(x==sqrt(cnt))return 1;
else return 0;
}
void cl(int &d){
int d2=d;
for(int i=2;i<=m;++i){
while(d2%(i*i)==0 && d2>=(i*i)){d2/=(i*i);csp*=i;}
if(d2<(i*i)){d=d2;return ;}
}
d=d2;
return ;
}
signed main(){
// freopen("uqe2.in","r",stdin);
// freopen("uqe2.ans","w",stdout);
cin>>t>>m;
while(t--){
int a,b,c,d;
double x1,x2,tot,p,q,p2,q2;
csp=1;
cin>>a>>b>>c;
d=b*b-4*a*c;
if(d<0){cout<<"NO\n";continue;}
x1=(-b+sqrt(d))*1.0/(a*2*1.0)*1.0;
x2=(-b-sqrt(d))*1.0/(a*2*1.0)*1.0;
p=(-b+sqrt(d))*1.0,q=(a*2*1.0)*1.0;
p2=(-b-sqrt(d))*1.0,q2=(a*2*1.0)*1.0;
tot=sqrt(d);
if(x1<x2){p=p2,q=q2;}
if(pd(tot)){
int p3=(int)(p),q3=(int)(q);
int flag=0;
if(p3<0){p3=abs(p3);flag++;}
if(q3<0){q3=abs(q3);flag++;}
if(flag==1)flag=1;
else flag=0;
int cnt=__gcd(p3,q3);
p3/=cnt,q3/=cnt;
if(flag==1)cout<<"-";
if(q3==1){cout<<p3<<"\n";continue;}
cout<<p3<<"/"<<q3<<"\n";
}else{
double a1=-(b*1.0/(a*2));
int a4=1/(a*2),flag=0,b2=-b,a2=a*2;
if(b2<0){b2=abs(b2);flag++;}
if(a2<0){a2=abs(a2);flag++;}
double a3=1*1.0/(a*2);
if(a1!=0){
if(flag%2==1)cout<<"-";
int u=__gcd(b2,a2);
b2/=u,a2/=u;
if(b2==0){cout<<0<<"\n";continue;}
if(a2==1)cout<<b2<<"+";
else cout<<b2<<"/"<<a2<<"+";
}
if(a3==1)printf("sqrt(%d)\n",d);
else{
cl(d);
if(pd(a3))printf("%d*sqrt(%d)\n",csp,d);
else{
int tu=a*2;
if(tu<0){tu=abs(tu);}
int rp=__gcd(csp,tu);
csp/=rp,tu/=rp;
if(csp>1)printf("%d*",csp);
printf("sqrt(%d)",d);
if(tu>1)printf("/%d\n",tu);
else printf("\n");
}
}
}
}
return 0;
}
求大佬们修改。