RT,没压位的时候只有AC和TLE,压位后只有AC和WA,大概自己是实在找不出来压位的时候哪里出锅了,请各位路过的大佬若有时间不吝赐教,万分感谢。
(压的是8位)
code:
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
const int mod = 100000000;
struct bigint
{
int len,x[N];
int &operator[](int i)
{
return x[i];
}
void flatten(int L)
{
len = L;
for(int i=1;i<=len;i++)
x[i + 1] += x[i] / mod, x[i] %= mod;
for(;!x[len];)
len--;
}
void print()
{
for(int i=len;i>=1;i--)
{
if(i == len)
printf("%d",x[i]);
else
printf("%08d",x[i]);
}
}
bool operator < (const bigint&k) const
{
if(len < k.len) return true;
if(len > k.len) return false;
for(int i=len;i>=1;i--)
{
if(x[i] < k.x[i]) return true;
if(x[i] > k.x[i]) return false;
}
return false;
}
bool operator == (const bigint&k) const
{
return !(k < *this) && !(*this < k);
}
};
bigint operator-(bigint num1,bigint num2)
{
bigint c;
int len_ = num1.len;
for(int i=1;i<=len_;i++)
c[i] = (num1[i] - num2[i]);
c.len = len_;
for(int i=1;i<=len_;i++)
{
if(c[i] < 0)
{
c[i] += mod;
c[i + 1]--;
}
}
while(!c[c.len])
c.len--;
return c;
}
bigint operator*(bigint num,int num_)
{
bigint c;
int len_ = num.len;
for(int i=1;i<=len_;i++)
c[i] = num[i] * num_;
c.flatten(len_ + 1);
return c;
}
bigint operator/(bigint num,int num_)
{
bigint c,d;
c.len = 0;
int len_ = num.len,flag = 0;
long long now = 0;
for(int i=len_;i>=1;i--)
{
now = now * mod + num[i];
if(now / num_ != 0) flag = 1;
if(now / num_ == 0 && !flag) continue;
c[++c.len] = (now / num_);
now %= num_;
}
for(int i=1;i<=c.len;i++)
d[i] = c[c.len - i + 1];
d.len = c.len;
return d;
}
string str1,str2;
bigint a,b,tmp,ans;
int lena,lenb,len_a,len_b,T,now,ten;
void gcd(int t)
{
if(a == b)
{
T = t;
ans = a;
return;
}
if(a < b)
{
swap(a,b);
gcd(t);
return;
}
if(a[1] % 2 == 0)
{
a = a / 2;
if(b[1] % 2 == 0)
{
b = b / 2;
gcd(t + 1);
return;
}
else
{
gcd(t);
return;
}
}
else
{
if(b[1] % 2 == 0)
{
b = b / 2;
gcd(t);
return;
}
else
{
a = a - b;
gcd(t);
return;
}
}
}
int main()
{
cin>>str1>>str2;
lena = str1.length();
lenb = str2.length();
for(int i=lena - 1;i>=0;i--)
{
if((lena - i) % 8 == 1) ten++;
else ten *= 10;
now += (str1[i] - '0') * ten;
if((lena - i) % 8 == 0 || i == 0)
{
a[++len_a] = now;
now = 0;
ten = 0;
}
}
a.len = len_a;
now = ten = 0;
for(int i=lenb - 1;i>=0;i--)
{
if((lenb - i) % 8 == 1) ten++;
else ten *= 10;
now += (str2[i] - '0') * ten;
if((lenb - i) % 8 == 0 || i == 0)
{
b[++len_b] = now;
now = 0;
ten = 0;
}
}
b.len = len_b;
gcd(0);
for(int i=1;i<=T;i++)
ans = ans * 2;
ans.print();
return 0;
}