20ptsTLE,Subtask2还是对了挺多的
查看原帖
20ptsTLE,Subtask2还是对了挺多的
1074084
asd890123楼主2024/6/6 20:58

其中9,10,11,13TLE,更相减损术+优化为log+优化为循环+优化取模为判断最后一位后还是有几个T了,求调(感觉已经到极限了) code:

#include <iostream>
#include <cstring>
#include <string>

constexpr int maxn = 1e4 + 5;

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

std::istream &operator>>(std::istream &is,BigInterger &x){
    
    std::string s;
    
    is >> s;
    x.len = s.length();
    for (int i = 1,j = x.len - 1;j >= 0;i++,j--) x[i] = s[j] - '0';
    
    return is;
}

std::ostream &operator<<(std::ostream &os,BigInterger x){
    
    for (int i = x.len;i;i--) os << x[i];
    
    return os;
}

BigInterger gcd(BigInterger a,BigInterger b){
    
    BigInterger tmp = 1;
    
    if (a == 0 || b == 0) return 0;
    while (a != b){
        
        if (a[1] % 2 == 1 && b[1] % 2 == 0) b = b / 2;
        else if (a[1] % 2 == 0 && b[1] % 2 == 1) a = a / 2;
        else if (a[1] % 2 == 0 && b[1] % 2 == 0) a = a / 2,b = b / 2,tmp = tmp * 2;
        else{
            
            if (a < b) std::swap(a,b);
            a = a - b;
            
        }
        
    }
    
    return a * tmp;
}

int main(){
    
    std::ios::sync_with_stdio(0);
    std::cin.tie(0),std::cout.tie(0);
    
    BigInterger a,b;
    
    std::cin >> a >> b;
    std::cout << gcd(a,b) << '\n';
    
    return 0;
}
2024/6/6 20:58
加载中...