各位大佬,帮个忙吧

当前设想:sqrt(negative)
C++代码(非常乱,请见谅……)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <utility>
#define can_div(a,b) ((a)/(b)==(double)(a)/(b))
#define cor_zero(val) (val==(-0)||val==(0)?0:val)
#define is_square_num(val) ((int)(sqrt(val))*(int)(sqrt(val))==val)
using namespace std;
int t,m,a,b,c;
//bool is_square[10000005];
/*void init_squares(int mmm)
{
is_square[0]=1;
for(int i = 1;i <= mmm;i ++) is_square[i*i]=1;
}*/
pair<int,int> simplify_sqrt(int val)
{
if(val==0||val==1) return make_pair(1,val);
// cout << "simplify: " << val << endl;
int cur1=1,cur2=val;
for(int i = 2;i <= sqrt(val);i --)
{
if(cur2%i) continue;
// cout << " | trying: " << i << ", is_square[i]==" << is_square[i] << endl;
cur2 /= (i*i);
cur1 *= i;
}
return make_pair(cur1,cur2);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> t >> m;
while(t--)
{
cin >> a >> b >> c;
int delta = b*b-4*a*c;
// cout << simplify_sqrt(delta).first << ' ' << simplify_sqrt(delta).second
// << '\n';
if(delta<0){cout << "NO\n"; continue;}
if(delta==0)
{
if(b==0) cout << "0\n";
else if(can_div(b,2*a)) cout << (0-b)/(2*a) << '\n';
else{int ds1=0-b,ds2=2*a;
if(ds1>=0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
else if(ds1<0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
cout << (ds1)/abs(__gcd(abs(ds1),abs(ds2))) << '/'
<< (ds2)/abs(__gcd(abs(ds1),abs(ds2))) << '\n';}
continue;
}
else
{
if(!is_square_num(delta))
{
pair<int,int> del_c = simplify_sqrt(delta);
if(b!=0)
{
if(can_div(b,2*a)) cout << (0-b)/(2*a) << '+';
else{int ds1=0-b,ds2=2*a;
if(ds1>=0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
else if(ds1<0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
cout << (ds1)/abs(__gcd(abs(ds1),abs(ds2))) << '/'
<< (ds2)/abs(__gcd(abs(ds1),abs(ds2))) << '+';}
}
int cache_int = __gcd(del_c.first,abs(2*a));
del_c.first = del_c.first/cache_int;
int out_rat = abs(2*a)/cache_int;
if(del_c.first!=1) cout << del_c.first << '*';
if(out_rat!=1)
cout << ((del_c.second==1)?("1/"):
("sqrt(" + to_string(del_c.second) + ")/")) << out_rat << '\n';
else cout << (del_c.second==1?("1\n"):
("sqrt(" + to_string(del_c.second) + ")\n"));
} else
{
if(2*a>0)
{
// cout << "blah\n";
if((int)sqrt(delta)-b==0) cout << "0\n";
else if(can_div((int)sqrt(delta)-b,2*a))
cout << cor_zero((sqrt(delta)-b)/cor_zero(2*a)) << '\n';
else{int ds1=(int)sqrt(delta)-b,ds2=2*a;
if(ds1>=0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
else if(ds1<0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
cout << cor_zero(ds1)/abs(__gcd(abs(ds1),abs(ds2))) << '/'
<< cor_zero(ds2)/abs(__gcd(abs(ds1),abs(ds2))) << '\n';}
}else
{
if(0-(int)sqrt(delta)-b==0) cout << "0\n";
else if(can_div(0-(int)sqrt(delta)-b,2*a))
cout << cor_zero(0-(int)sqrt(delta)-b)/cor_zero(2*a) << '\n';
else{int ds1=0-(int)sqrt(delta)-b,ds2=2*a;
if(ds1>=0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
else if(ds1<0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
cout << cor_zero(ds1)/abs(__gcd(abs(ds1),abs(ds2))) << '/'
<< cor_zero(ds2)/abs(__gcd(abs(ds1),abs(ds2))) << '\n';}
}
}
}
}
return 0;
}