Description:
Accept:
#include<bits/stdc++.h>
using namespace std;
struct BigBinary
{
std::vector<int> x; // 由低位到高位保存二进制位
bool neg; // 标记数的正负
void Init() { x.clear(); neg = false; }
BigBinary() { Init(); }
};
bool iszero(BigBinary &a);
void Print(BigBinary &a)
{
if (iszero(a))
{
printf("0");
return;
}
while (a.x[a.x.size() - 1] == 0)
a.x.pop_back();
for (int i = a.x.size() - 1; i >= 0; i--)
printf("%d", a.x[i]);
printf("\n");
}
bool iszero(BigBinary &a) {
if (!a.x.empty()) {
while (!a.x.empty() && a.x[a.x.size() - 1] == 0)a.x.pop_back();
if (a.x.empty())return true;
else return false;
}
return true;
}
BigBinary Add(BigBinary& a, BigBinary& b)
{
if (iszero(a))return b;
else if (iszero(b))return a;
BigBinary c;
int flag = 0, current;
for (int i = 0; i <= max(a.x.size(), b.x.size()); i++)
{
if (i < a.x.size() && i < b.x.size())
{
current = a.x[i] + b.x[i] + flag;
flag = current / 2;
c.x.push_back(current % 2);
}
else if (i < a.x.size())
{
current = a.x[i] + flag;
flag = current / 2;
c.x.push_back(current % 2);
}
else if (i < b.x.size())
{
current = b.x[i] + flag;
flag = current / 2;
c.x.push_back(current % 2);
}
else if (flag)
c.x.push_back(flag);
}
return c;
}
BigBinary Minus(BigBinary& a, BigBinary& b)
{
if (iszero(b))return a;
BigBinary c;
int flag = 0, current, i;
for (i = 0; i < a.x.size(); i++) {
if (i < b.x.size()) {
current = a.x[i] - b.x[i] - flag;
if (current < 0)current = current + 2, flag = 1;
else flag = 0;
c.x.push_back(current);
}
else {
current = a.x[i] - flag;
if (current < 0)current = current + 2, flag = 1;
else flag = 0;
c.x.push_back(current);
}
}
return c;
}
BigBinary Mul(BigBinary& a, BigBinary& b)
{
if (iszero(a))return a;
else if (iszero(b))return b;
else if (a.x.size() == 1)return b;
else if (b.x.size() == 1)return a;
BigBinary c;
int flag = 0;
for (int i = 0; i < a.x.size() + b.x.size() + 1; i++)
c.x.push_back(0);
for (int i = 0; i < a.x.size(); i++)
{
for (int j = 0; j < b.x.size(); j++)
{
c.x[i + j] += a.x[i] & b.x[j];
}
}
for (int i = 0; i < c.x.size(); i++)
{
c.x[i] += flag;
flag = c.x[i] / 2;
c.x[i] = c.x[i] % 2;
}
while (flag)
{
c.x.push_back(flag % 2);
flag /= 2;
}
return c;
}
void MulN2(BigBinary& a, int n)
{
for (int i = 0; i < n; i++)
a.x.push_back(0);
for (int i = a.x.size() - 1; i >= n; i--)
a.x[i] = a.x[i - n];
for (int i = n - 1; i >= 0; i--)
a.x[i] = 0;
}
BigBinary FasterMul(BigBinary& a, BigBinary& b)
{
if (iszero(a))return a;
else if (iszero(b))return b;
else if (a.x.size() == 1)return b;
else if (b.x.size() == 1)return a;
int n = max(a.x.size(), b.x.size()) / 2 * 2;
if (a.x.size() < 1000 || b.x.size() < 1000)return Mul(a, b);
BigBinary a1, a2, b1, b2, A, B, C, D;
for (int i = 0; i < n / 2 && i < a.x.size(); i++)
a2.x.push_back(a.x[i]);
for (int i = n / 2; i < a.x.size(); i++)
a1.x.push_back(a.x[i]);
for (int i = 0; i < n / 2 && i < b.x.size(); i++)
b2.x.push_back(b.x[i]);
for (int i = n / 2; i < b.x.size(); i++)
b1.x.push_back(b.x[i]);
A = FasterMul(a1, b1);
B = FasterMul(a2, b2);
BigBinary a1adda2 = Add(a1, a2);
BigBinary b1addb2 = Add(b1, b2);
C = FasterMul(a1adda2, b1addb2);
BigBinary CsubA = Minus(C, A);
D = Minus(CsubA, B);
MulN2(A, n), MulN2(D, n / 2);
BigBinary DaddB = Add(D, B);
BigBinary result = Add(A, DaddB);
return result;
}
int main()
{
BigBinary a, b, result;
string p, q;
cin >> p >> q;
for (int i = p.length()-1; i >=0; i--)
a.x.push_back((p[i]-'0'));
for (int i = q.length()-1; i >=0; i--)
b.x.push_back((q[i] - '0'));
result = FasterMul(a, b);
Print(result);
return 0;
}