看题解里面复杂度都是O(TM)的,我这个好像最多也就O(T*sqrt(m)),而且完全跑不满,麻烦大佬们看下,是复杂度真得更低,还是我算错了:
#include <math.h>
#include <vector>
#include <iostream>
#include <algorithm>
#define KKSC03 The best person in LuoGu.
#define CCF The best places for C++ studiers.
#define NOIP The best competion for high school.
#define CSP The best competion for middle school.
class fact{
public:
int a,b;
fact(){}
fact(int x){a = x,b = 1;}
fact(int x,int y){a = x,b = y;}
fact& normal(){
int gcd = std::__gcd(a,b);
a /= gcd;
b /= gcd;
if (b < 0) a = -a,b = -b;
return *this;
}
};
#define oven(x) ((x) % 2 ? (x) - 1 : (x))
std::ostream &operator<<(std::ostream &os,fact x){
x.normal();
if (x.b == 1) os << x.a;
else os << x.a << '/' << x.b;
return os;
}
std::vector <std::pair <int,int> > to_primes(int x){
int cnt;
std::vector <std::pair <int,int> > v;
for (int i = 2;i * i <= x;i++){
cnt = 0;
while (x % i == 0) cnt++,x /= i;
v.push_back({i,cnt});
}
if (x != 1) v.push_back({x,1});
return v;
}
int main(){
std::ios::sync_with_stdio(0);
std::cin.tie(0),std::cout.tie(0);
fact q1,q2;
int T,m,a,b,c,delta;
std::vector <std::pair <int,int> > v;
std::cin >> T >> m;
while (T--){
std::cin >> a >> b >> c;
delta = b * b - 4 * a * c;
if (delta < 0) std::cout << "NO";
else if (delta == 0) std::cout << fact(-b,2 * a).normal();
else{
q2 = fact(1);
q1 = fact(-b,2 * a);
if (sqrt(delta) == int(sqrt(delta))){
if (a > 0) q1.a += int(sqrt(delta));
else q1.a -= int(sqrt(delta));
std::cout << q1.normal() << '\n';
continue;
}
if (q1.a != 0) std::cout << q1.normal() << '+';
v = to_primes(delta);
for (int i = 0;i < v.size();i++)
if (v[i].second >= 2)
q2.a *= pow(v[i].first,v[i].second / 2),delta /= pow(v[i].first,oven(v[i].second));
if (a < 0) q2.a *= -1;
q2.b = 2 * a;
q2.normal();
if (q2.a == 1 && q2.b == 1) std::cout << "sqrt(" << delta << ')';
else if (q2.b == 1) std::cout << q2 << "*sqrt(" << delta << ')';
else if (q2.a == 1 || q2.a == -1) std::cout << "sqrt(" << delta << ")/" << q2.b;
else std::cout << q2.a << "*sqrt(" << delta << ")/" << q2.b;
}
std::cout << '\n';
}
return 0;
}