高精度80pts,#1,#6,#11(hack)TLE求助
查看原帖
高精度80pts,#1,#6,#11(hack)TLE求助
1074084
asd890123楼主2024/6/14 15:37

按理来说复杂度应该是O(log8(x)*log10(x)+log16(x)*log10(x)),小于1e6,为什么会T,code:

#include <iostream>
#include <cstring>
#include <cctype>

const int maxn = 1005;
const std::string to_char = "0123456789abcdefghijklmnopqrstuvwxyz";

struct BigInterger{
    
    int a[maxn],len;
    
    int &operator[](int i){return a[i];}
    
    BigInterger(int x = 0){
        
        memset(a,0,sizeof(a));
        for (len = 1;x;len++)
            a[len] = x % 10,x /= 10;
        len--;
            
    }
    
    BigInterger &operator=(int x){return *this = BigInterger(x);}
    
    void flatten(int l){
        
        len = l;
        for (int i = 1;i <= len;i++)
            a[i + 1] += a[i] / 10,a[i] %= 10;
        while (!a[len]) len--;
        
    }
    
    BigInterger operator*(int x){
        
        BigInterger ans;
        
        for (int i = 1;i <= len;i++) ans[i] = a[i] * x;
        ans.flatten(len + 11);
        
        return ans;
    }
    
    BigInterger operator+(BigInterger x){
        
        BigInterger ans;
        
        for (int i = 1;i <= std::max(len,x.len);i++) ans[i] = a[i] + x[i];
        ans.flatten(std::max(len,x.len) + 1);
        
        return ans;
    }
    
    BigInterger operator/(int x){
        
        int r = 0;
        BigInterger ans;
        
        for (int i = len;i;i--){
            
            r = r * 10 + a[i];
            ans[i] = r / x,r %= x;
            
        }
        ans.flatten(len);
        
        return ans;
    }
    
    int operator%(int x){
        
        int r = 0;
        BigInterger ans;
        
        for (int i = len;i;i--){
            
            r = r * 10 + a[i];
            ans[i] = r / x,r %= x;
            
        }
        
        return r;
    }
    
    bool operator>=(BigInterger x){
        
        if (len != x.len) return len > x.len;
        for (int i = len;i;i--)
            if (a[i] != x[i])
                return a[i] > x[i];
        
        return 1;
    }
    
};

void write(BigInterger x,int k);

void read(BigInterger &x,int k){
    
    x = 0;
    char c = getchar_unlocked();
    
    while (!isdigit(c)) c = getchar_unlocked();
    while (isdigit(c)) x = x * k + (c - '0'),c = getchar_unlocked();
    
}

void write(BigInterger x,int k){
    
    if (x >= k) write(x / k,k);
    putchar_unlocked(to_char[x % k]);
    
}

int main(){
    
    BigInterger num;
    
    read(num,8);
    write(num,16);
    
    return 0;
}
2024/6/14 15:37
加载中...