BigInt operator + (const BigInt &b) { BigInt r; r.len = max(len, b.len) + 1; for(int i = 1; i <= r.len; i++) { r.c[i] += c[i] + b.c[i]; r.c[i+1] += r.c[i] / base; r.c[i] %= base; } r.Zero(); return r; }
BigInt operator / (int a) { BigInt res; res.len=len; for(int i=res.len;i>=1;i--) { res.c[i]+=c[i]; res.c[i]/=a; if(i>1) res.c[i-1]+=c[i]%a*number; } res.Zero(); return res; }
BigInt P(BigInt a,BigInt b) { BigInt res; res.len=max(a.len,b.len)+1; for(int i=1;i<=res.len;i++) { res.c[i]+=a.c[i]+b.c[i]; res.c[i+1]+=res.c[i]/100000; res.c[i]%=100000; } res.Zero(); return res; }
BigInt operator + (BigInt a) { BigInt res; res.len=max(len,a.len)+1; for(int i=1;i<=res.len;i++) { res.c[i]+=c[i]+a.c[i]; res.c[i+1]+=res.c[i]/number; res.c[i]%=number; } res.Zero(); return res; }
BigInt operator * (const BigInt &b) { BigInt r; r.len = len + b.len + 2; for(int i = 1; i <= len; i++) { for(int j = 1; j <= b.len; j++) { r.c[j+i-1] += c[i] * b.c[j]; } } for(int i = 1; i <= r.len; i++) { r.c[i+1] += r.c[i] / base; r.c[i] %= base; } r.Zero(); return r; }