其中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;
}