求时间复杂度分析。
查看原帖
求时间复杂度分析。
1074084
asd890123楼主2024/5/24 17:33

看题解里面复杂度都是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;
}
2024/5/24 17:33
加载中...