#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
typedef vector<int> VI;
typedef long long LL;
#define FOR(x, b, e) for(int x = b; x <= (e); ++x)
#define FORD(x, b, e) for(int x = b; x >= (e); --x)
#define REP(x, n) for(int x = 0; x < (n); ++x)
#define VAR(v, n) __typeof(n) v = (n)
#define ALL(c) (c).begin(), (c).end()
#define SIZE(x) ((int)(x).size())
#define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i)
#define PB push_back
#define ST first
#define ND second
struct BigNum {
#define REDUCE() while(len>1 && !cyf[len-1]) len--;
static const int BASE = 1000000000, BD = 9;
int len, al;
LL* cyf;
BigNum(int v = 0, int l = 2) : len(1), al(l), cyf(new LL[l]) {
REP(x, al) cyf[x] = 0;
if ((cyf[0] = v) >= BASE) przen(1);
}
BigNum(const BigNum &a) : len(a.len), al(len), cyf(new LL[al]) {
REP(x, al) cyf[x] = a.cyf[x];
}
~BigNum(){ delete cyf; }
void Res(int l) {
if (l>al) {
LL* n = new LL[l = max(l, 2 * al)];
REP(x, l) n[x] = x >= al ? 0 : cyf[x];
delete cyf;
cyf = n;
al = l;
}
}
void przen(int p) {
int x = 0;
for (; x<p || cyf[x]<0 || cyf[x] >= BASE; x++) {
Res(x + 2);
if (cyf[x]<0){ LL i = (-cyf[x] - 1) / BASE + 1; cyf[x] += i*BASE; cyf[x + 1] -= i; }
else
if (cyf[x] >= BASE){ LL i = cyf[x] / BASE; cyf[x] -= i*BASE; cyf[x + 1] += i; }
}
len = max(len, x + 1);
REDUCE();
}
#define OPER1(op) bool operator op (const BigNum &a) const
OPER1(== ) {
if (a.len != len) return 0;
REP(x, len) if (cyf[x] != a.cyf[x]) return 0;
return 1;
}
OPER1(<) {
if (len != a.len) return len<a.len;
int x = len - 1;
while (x && a.cyf[x] == cyf[x]) x--;
return cyf[x]<a.cyf[x];
}
OPER1(>) { return a<*this; }
OPER1(<= ) { return !(a<*this); }
OPER1(>= ) { return !(*this<a); }
OPER1(!= ) { return !(*this == a); }
BigNum &operator=(int a) {
REP(x, len) cyf[x] = 0;
len = 1;
if (cyf[0] = a >= BASE) przen(1);
return *this;
}
void operator+=(int a){ cyf[0] += a; przen(1); }
void operator-=(int a){ cyf[0] -= a; przen(1); }
void operator*=(int a){ REP(x, len) cyf[x] *= a; przen(len); }
int operator/=(int a) {
LL w = 0;
FORD(p, len - 1, 0){ w = w*BASE + cyf[p]; cyf[p] = w / a; w %= a; }
REDUCE();
return w;
}
int operator%(int a) {
LL w = 0;
FORD(p, len - 1, 0) w = (w*BASE + cyf[p]) % a;
return w;
}
#define OPER2(op) BigNum& operator op (const BigNum &a)
OPER2(+= ) {
Res(a.len);
REP(x, a.len) cyf[x] += a.cyf[x];
przen(a.len);
return *this;
}
OPER2(-= ) {
REP(x, a.len) cyf[x] -= a.cyf[x];
przen(a.len);
return *this;
}
OPER2(*= ) {
BigNum c(0, len + a.len);
REP(x, a.len) {
REP(y, len) c.cyf[y + x] += cyf[y] * a.cyf[x];
c.przen(len + x);
}
*this = c;
return *this;
}
OPER2(/= ) {
int n = max(len - a.len + 1, 1);
BigNum d(0, n), prod;
FORD(i, n - 1, 0) {
int l = 0, r = BASE - 1;
while (l<r) {
int m = (l + r + 1) / 2;
if (*this < prod + (a*m << i))
r = m - 1;
else
l = m;
}
prod += a*l << i;
d.cyf[i] = l;
if (l) d.len = max(d.len, i + 1);
}
*this = d;
return *this;
}
OPER2(%= ) {
BigNum v = *this;
v /= a;
v *= a;
*this -= v;
return *this;
}
OPER2(= ) {
Res(a.len);
FORD(x, len - 1, a.len) cyf[x] = 0;
REP(x, a.len) cyf[x] = a.cyf[x];
len = a.len;
return *this;
}
void read(const VI &v, int p) {
*this = 0;
FORD(x, SIZE(v), 0) {
*this *= p;
*this += v[x];
}
}
BigNum &operator=(string a) {
int s = a.length();
*this = 0;
Res(len = s / BD + 1);
REP(x, s) cyf[(s - x - 1) / BD] = 10 * cyf[(s - x - 1) / BD] + a[x] - '0';
REDUCE();
return *this;
}
void write() const {
printf("%d", int(cyf[len - 1]));
FORD(x, len - 2, 0) printf("%0*d", BD, int(cyf[x]));
}
void write(char *buf) const {
int p = sprintf(buf, "%d", int(cyf[len - 1]));
FORD(x, len - 2, 0) p += sprintf(buf + p, "%0*d", BD, int(cyf[x]));
}
VI write(int pod) const {
VI w;
BigNum v;
v = *this;
while (v.len>1 || v.cyf[0]) w.PB(v /= pod);
return w;
}
BigNum &operator>>=(int n) {
if (n >= len) n = len;
REP(x, len - n) cyf[x] = cyf[x + n];
FOR(x, len - n, n) cyf[x] = 0;
len -= n;
if (len == 0) len = 1;
return *this;
}
BigNum &operator<<=(int n) {
if (cyf[0] == 0 && len == 1) return *this;
Res(len + n);
FORD(x, len - 1, 0) cyf[x + n] = cyf[x];
REP(x, n) cyf[x] = 0;
len += n;
return *this;
}
BigNum sqrt() {
int n = (len + 1) / 2;
BigNum a(0, n), sq;
FORD(i, n - 1, 0) {
int l = 0, r = BASE - 1;
while (l<r) {
int m = (l + r + 1) / 2;
if (*this < sq + (a * 2 * m << i) + (BigNum(m)*m << 2 * i))
r = m - 1;
else
l = m;
}
sq += (a * 2 * l << i) + (BigNum(l)*l << 2 * i);
a.cyf[i] = l; a.len = n;
}
return a;
}
#define OPER3(op) BigNum operator op(const BigNum &a) \
const {BigNum w = *this; w op ## = a; return w; }
#define OPER4(op) BigNum operator op(int a) \
{BigNum w = *this; w op ## = a; return w; }
OPER3(+);
OPER3(-);
OPER3(*);
OPER3(/ );
OPER3(%);
OPER4(<< );
OPER4(>> );
};
int main() {
BigNum a, b;
string ta, tb;
cin >> ta >> tb;
a = ta; b = tb;
cout << "a = ";
a.write();
cout << endl << "b = ";
b.write();
cout << endl << "a+b = ";
(a + b).write();
cout << endl << "a-b = ";
(a - b).write();
cout << endl << "a*b = ";
(a*b).write();
cout << endl << "a/b = ";
(a / b).write();
cout << endl << "sqrt(a) = ";
a.sqrt().write();
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgdmVjdG9yPGludD4gVkk7CnR5cGVkZWYgbG9uZyBsb25nIExMOwoKI2RlZmluZSBGT1IoeCwgYiwgZSkgZm9yKGludCB4ID0gYjsgeCA8PSAoZSk7ICsreCkKI2RlZmluZSBGT1JEKHgsIGIsIGUpIGZvcihpbnQgeCA9IGI7IHggPj0gKGUpOyAtLXgpCiNkZWZpbmUgUkVQKHgsIG4pIGZvcihpbnQgeCA9IDA7IHggPCAobik7ICsreCkKI2RlZmluZSBWQVIodiwgbikgX190eXBlb2YobikgdiA9IChuKQojZGVmaW5lIEFMTChjKSAoYykuYmVnaW4oKSwgKGMpLmVuZCgpCiNkZWZpbmUgU0laRSh4KSAoKGludCkoeCkuc2l6ZSgpKQojZGVmaW5lIEZPUkVBQ0goaSwgYykgZm9yKFZBUihpLCAoYykuYmVnaW4oKSk7IGkgIT0gKGMpLmVuZCgpOyArK2kpCiNkZWZpbmUgUEIgcHVzaF9iYWNrCiNkZWZpbmUgU1QgZmlyc3QKI2RlZmluZSBORCBzZWNvbmQKc3RydWN0IEJpZ051bSB7CiNkZWZpbmUgUkVEVUNFKCkgd2hpbGUobGVuPjEgJiYgIWN5ZltsZW4tMV0pIGxlbi0tOwoJc3RhdGljIGNvbnN0IGludCBCQVNFID0gMTAwMDAwMDAwMCwgQkQgPSA5OwoJaW50IGxlbiwgYWw7CglMTCogY3lmOwoJQmlnTnVtKGludCB2ID0gMCwgaW50IGwgPSAyKSA6IGxlbigxKSwgYWwobCksIGN5ZihuZXcgTExbbF0pIHsKCQlSRVAoeCwgYWwpIGN5Zlt4XSA9IDA7CgkJaWYgKChjeWZbMF0gPSB2KSA+PSBCQVNFKSBwcnplbigxKTsKCX0KCUJpZ051bShjb25zdCBCaWdOdW0gJmEpIDogbGVuKGEubGVuKSwgYWwobGVuKSwgY3lmKG5ldyBMTFthbF0pIHsKCQlSRVAoeCwgYWwpIGN5Zlt4XSA9IGEuY3lmW3hdOwoJfQoJfkJpZ051bSgpeyBkZWxldGUgY3lmOyB9Cgl2b2lkIFJlcyhpbnQgbCkgewoJCWlmIChsPmFsKSB7CgkJCUxMKiBuID0gbmV3IExMW2wgPSBtYXgobCwgMiAqIGFsKV07CgkJCVJFUCh4LCBsKSBuW3hdID0geCA+PSBhbCA/IDAgOiBjeWZbeF07CgkJCWRlbGV0ZSBjeWY7CgkJCWN5ZiA9IG47CgkJCWFsID0gbDsKCQl9Cgl9Cgl2b2lkIHByemVuKGludCBwKSB7CgkJaW50CXggPSAwOwoJCWZvciAoOyB4PHAgfHwgY3lmW3hdPDAgfHwgY3lmW3hdID49IEJBU0U7IHgrKykgewoJCQlSZXMoeCArIDIpOwoJCQlpZiAoY3lmW3hdPDApeyBMTCBpID0gKC1jeWZbeF0gLSAxKSAvIEJBU0UgKyAxOyBjeWZbeF0gKz0gaSpCQVNFOyBjeWZbeCArIDFdIC09IGk7IH0KCQkJZWxzZQoJCQlpZiAoY3lmW3hdID49IEJBU0UpeyBMTCBpID0gY3lmW3hdIC8gQkFTRTsgY3lmW3hdIC09IGkqQkFTRTsgY3lmW3ggKyAxXSArPSBpOyB9CgkJfQoJCWxlbiA9IG1heChsZW4sIHggKyAxKTsKCQlSRURVQ0UoKTsKCX0KI2RlZmluZSBPUEVSMShvcCkgYm9vbCBvcGVyYXRvciBvcCAoY29uc3QgQmlnTnVtICZhKSBjb25zdAoKCU9QRVIxKD09ICkgewoJCWlmIChhLmxlbiAhPSBsZW4pIHJldHVybiAwOwoJCVJFUCh4LCBsZW4pIGlmIChjeWZbeF0gIT0gYS5jeWZbeF0pIHJldHVybiAwOwoJCXJldHVybiAxOwoJfQoJT1BFUjEoPCkgewoJCWlmIChsZW4gIT0gYS5sZW4pIHJldHVybiBsZW48YS5sZW47CgkJaW50IHggPSBsZW4gLSAxOwoJCXdoaWxlICh4ICYmIGEuY3lmW3hdID09IGN5Zlt4XSkgeC0tOwoJCXJldHVybiBjeWZbeF08YS5jeWZbeF07Cgl9CglPUEVSMSg+KSB7IHJldHVybiBhPCp0aGlzOyB9CglPUEVSMSg8PSApIHsgcmV0dXJuICEoYTwqdGhpcyk7IH0KCU9QRVIxKD49ICkgeyByZXR1cm4gISgqdGhpczxhKTsgfQoJT1BFUjEoIT0gKSB7IHJldHVybiAhKCp0aGlzID09IGEpOyB9CgoJQmlnTnVtICZvcGVyYXRvcj0oaW50IGEpIHsKCQlSRVAoeCwgbGVuKSBjeWZbeF0gPSAwOwoJCWxlbiA9IDE7CgkJaWYgKGN5ZlswXSA9IGEgPj0gQkFTRSkgcHJ6ZW4oMSk7CgkJcmV0dXJuICp0aGlzOwoJfQoJdm9pZCBvcGVyYXRvcis9KGludCBhKXsgY3lmWzBdICs9IGE7IHByemVuKDEpOyB9Cgl2b2lkIG9wZXJhdG9yLT0oaW50IGEpeyBjeWZbMF0gLT0gYTsgcHJ6ZW4oMSk7IH0KCXZvaWQgb3BlcmF0b3IqPShpbnQgYSl7IFJFUCh4LCBsZW4pIGN5Zlt4XSAqPSBhOyBwcnplbihsZW4pOyB9CglpbnQgb3BlcmF0b3IvPShpbnQgYSkgewoJCUxMIHcgPSAwOwoJCUZPUkQocCwgbGVuIC0gMSwgMCl7IHcgPSB3KkJBU0UgKyBjeWZbcF07IGN5ZltwXSA9IHcgLyBhOyB3ICU9IGE7IH0KCQlSRURVQ0UoKTsKCQlyZXR1cm4gdzsKCX0KCWludCBvcGVyYXRvciUoaW50IGEpIHsKCQlMTCB3ID0gMDsKCQlGT1JEKHAsIGxlbiAtIDEsIDApIHcgPSAodypCQVNFICsgY3lmW3BdKSAlIGE7CgkJcmV0dXJuIHc7Cgl9CiNkZWZpbmUgT1BFUjIob3ApIEJpZ051bSYgb3BlcmF0b3Igb3AgKGNvbnN0IEJpZ051bSAmYSkKCU9QRVIyKCs9ICkgewoJCVJlcyhhLmxlbik7CgkJUkVQKHgsIGEubGVuKSBjeWZbeF0gKz0gYS5jeWZbeF07CgkJcHJ6ZW4oYS5sZW4pOwoJCXJldHVybiAqdGhpczsKCX0KCU9QRVIyKC09ICkgewoJCVJFUCh4LCBhLmxlbikgY3lmW3hdIC09IGEuY3lmW3hdOwoJCXByemVuKGEubGVuKTsKCQlyZXR1cm4gKnRoaXM7Cgl9CglPUEVSMigqPSApIHsKCQlCaWdOdW0gYygwLCBsZW4gKyBhLmxlbik7CgkJUkVQKHgsIGEubGVuKSB7CgkJCVJFUCh5LCBsZW4pIGMuY3lmW3kgKyB4XSArPSBjeWZbeV0gKiBhLmN5Zlt4XTsKCQkJYy5wcnplbihsZW4gKyB4KTsKCQl9CgkJKnRoaXMgPSBjOwoJCXJldHVybiAqdGhpczsKCX0KCU9QRVIyKC89ICkgewoJCWludCBuID0gbWF4KGxlbiAtIGEubGVuICsgMSwgMSk7CgkJQmlnTnVtIGQoMCwgbiksIHByb2Q7CgkJRk9SRChpLCBuIC0gMSwgMCkgewoJCQlpbnQgbCA9IDAsIHIgPSBCQVNFIC0gMTsKCQkJd2hpbGUgKGw8cikgewoJCQkJaW50CW0gPSAobCArIHIgKyAxKSAvIDI7CgkJCQlpZiAoKnRoaXMgPCBwcm9kICsgKGEqbSA8PCBpKSkKCQkJCQlyID0gbSAtIDE7CgkJCQllbHNlCgkJCQkJbCA9IG07CgkJCX0KCQkJcHJvZCArPSBhKmwgPDwgaTsKCQkJZC5jeWZbaV0gPSBsOwoJCQlpZiAobCkgZC5sZW4gPSBtYXgoZC5sZW4sIGkgKyAxKTsKCQl9CgkJKnRoaXMgPSBkOwoJCXJldHVybiAqdGhpczsKCX0KCU9QRVIyKCU9ICkgewoJCUJpZ051bSB2ID0gKnRoaXM7CgkJdiAvPSBhOwoJCXYgKj0gYTsKCQkqdGhpcyAtPSB2OwoJCXJldHVybiAqdGhpczsKCX0KCU9QRVIyKD0gKSB7CgkJUmVzKGEubGVuKTsKCQlGT1JEKHgsIGxlbiAtIDEsIGEubGVuKSBjeWZbeF0gPSAwOwoJCVJFUCh4LCBhLmxlbikgY3lmW3hdID0gYS5jeWZbeF07CgkJbGVuID0gYS5sZW47CgkJcmV0dXJuICp0aGlzOwoJfQoJdm9pZCByZWFkKGNvbnN0IFZJICZ2LCBpbnQgcCkgewoJCSp0aGlzID0gMDsKCQlGT1JEKHgsIFNJWkUodiksIDApIHsKCQkJKnRoaXMgKj0gcDsKCQkJKnRoaXMgKz0gdlt4XTsKCQl9Cgl9CglCaWdOdW0gJm9wZXJhdG9yPShzdHJpbmcgYSkgewoJCWludCBzID0gYS5sZW5ndGgoKTsKCQkqdGhpcyA9IDA7CgkJUmVzKGxlbiA9IHMgLyBCRCArIDEpOwoJCVJFUCh4LCBzKSBjeWZbKHMgLSB4IC0gMSkgLyBCRF0gPSAxMCAqIGN5ZlsocyAtIHggLSAxKSAvIEJEXSArIGFbeF0gLSAnMCc7CgkJUkVEVUNFKCk7CgkJcmV0dXJuICp0aGlzOwoJfQoJdm9pZCB3cml0ZSgpIGNvbnN0IHsKCQlwcmludGYoIiVkIiwgaW50KGN5ZltsZW4gLSAxXSkpOwoJCUZPUkQoeCwgbGVuIC0gMiwgMCkgcHJpbnRmKCIlMCpkIiwgQkQsIGludChjeWZbeF0pKTsKCX0KCXZvaWQgd3JpdGUoY2hhciAqYnVmKSBjb25zdCB7CgkJaW50IHAgPSBzcHJpbnRmKGJ1ZiwgIiVkIiwgaW50KGN5ZltsZW4gLSAxXSkpOwoJCUZPUkQoeCwgbGVuIC0gMiwgMCkgcCArPSBzcHJpbnRmKGJ1ZiArIHAsICIlMCpkIiwgQkQsIGludChjeWZbeF0pKTsKCX0KCVZJIHdyaXRlKGludCBwb2QpIGNvbnN0IHsKCQlWSSB3OwoJCUJpZ051bSB2OwoJCXYgPSAqdGhpczsKCQl3aGlsZSAodi5sZW4+MSB8fCB2LmN5ZlswXSkgdy5QQih2IC89IHBvZCk7CgkJcmV0dXJuIHc7Cgl9CglCaWdOdW0gJm9wZXJhdG9yPj49KGludCBuKSB7CgkJaWYgKG4gPj0gbGVuKSBuID0gbGVuOwoJCVJFUCh4LCBsZW4gLSBuKSBjeWZbeF0gPSBjeWZbeCArIG5dOwoJCUZPUih4LCBsZW4gLSBuLCBuKSBjeWZbeF0gPSAwOwoJCWxlbiAtPSBuOwoJCWlmIChsZW4gPT0gMCkgbGVuID0gMTsKCQlyZXR1cm4gKnRoaXM7Cgl9CglCaWdOdW0gJm9wZXJhdG9yPDw9KGludCBuKSB7CgkJaWYgKGN5ZlswXSA9PSAwICYmIGxlbiA9PSAxKSByZXR1cm4gKnRoaXM7CgkJUmVzKGxlbiArIG4pOwoJCUZPUkQoeCwgbGVuIC0gMSwgMCkgY3lmW3ggKyBuXSA9IGN5Zlt4XTsKCQlSRVAoeCwgbikgY3lmW3hdID0gMDsKCQlsZW4gKz0gbjsKCQlyZXR1cm4gKnRoaXM7Cgl9CglCaWdOdW0gc3FydCgpIHsKCQlpbnQgbiA9IChsZW4gKyAxKSAvIDI7CgkJQmlnTnVtIGEoMCwgbiksIHNxOwoJCUZPUkQoaSwgbiAtIDEsIDApIHsKCQkJaW50IGwgPSAwLCByID0gQkFTRSAtIDE7CgkJCXdoaWxlIChsPHIpIHsKCQkJCWludCBtID0gKGwgKyByICsgMSkgLyAyOwoJCQkJaWYgKCp0aGlzIDwgc3EgKyAoYSAqIDIgKiBtIDw8IGkpICsgKEJpZ051bShtKSptIDw8IDIgKiBpKSkKCQkJCQlyID0gbSAtIDE7CgkJCQllbHNlCgkJCQkJbCA9IG07CgkJCX0KCQkJc3EgKz0gKGEgKiAyICogbCA8PCBpKSArIChCaWdOdW0obCkqbCA8PCAyICogaSk7CgkJCWEuY3lmW2ldID0gbDsgYS5sZW4gPSBuOwoJCX0KCQlyZXR1cm4gYTsKCX0KI2RlZmluZSBPUEVSMyhvcCkgQmlnTnVtIG9wZXJhdG9yIG9wKGNvbnN0IEJpZ051bSAmYSkgXAoJY29uc3Qge0JpZ051bSB3ID0gKnRoaXM7ICB3IG9wICMjID0gYTsgIHJldHVybiB3OyB9CiNkZWZpbmUgT1BFUjQob3ApIEJpZ051bSBvcGVyYXRvciBvcChpbnQgYSkgXAoJe0JpZ051bSB3ID0gKnRoaXM7IHcgb3AgIyMgPSBhOyByZXR1cm4gdzsgfQoJT1BFUjMoKyk7CglPUEVSMygtKTsKCU9QRVIzKCopOwoJT1BFUjMoLyApOwoJT1BFUjMoJSk7CglPUEVSNCg8PCApOwoJT1BFUjQoPj4gKTsKfTsKaW50IG1haW4oKSB7CglCaWdOdW0gYSwgYjsKCXN0cmluZyB0YSwgdGI7CgljaW4gPj4gdGEgPj4gdGI7CglhID0gdGE7IGIgPSB0YjsKCWNvdXQgPDwgImEgPSAiOwoJYS53cml0ZSgpOwoJY291dCA8PCBlbmRsIDw8ICJiID0gIjsKCWIud3JpdGUoKTsKCWNvdXQgPDwgZW5kbCA8PCAiYStiID0gIjsKCShhICsgYikud3JpdGUoKTsKCWNvdXQgPDwgZW5kbCA8PCAiYS1iID0gIjsKCShhIC0gYikud3JpdGUoKTsKCWNvdXQgPDwgZW5kbCA8PCAiYSpiID0gIjsKCShhKmIpLndyaXRlKCk7Cgljb3V0IDw8IGVuZGwgPDwgImEvYiA9ICI7CgkoYSAvIGIpLndyaXRlKCk7Cgljb3V0IDw8IGVuZGwgPDwgInNxcnQoYSkgPSAiOwoJYS5zcXJ0KCkud3JpdGUoKTsKCXJldHVybiAwOwp9