大数运算
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
using namespace std;
const int maxn = 100+10;
const int ten[4] = {1,10,100,1000};
struct BigNum{
int d[maxn];
BigNum(string s){
int len =s.size();
d[0] = (len-1)/4+1;
int i,j,k;
for(i = 1; i < maxn; i++) d[i] = 0;
for(i = len-1;i>=0;i--){
j = (len-1-i)/4+1;
k = (len-1-i)%4;
d[j]+=ten[k]*(s[i]-'0');
}
while(d[0]>1&&d[d[0]]==0) --d[0];
}
BigNum(){
*this = BigNum(string("0"));
}
string toString(){
string s("");
int i,j,tmp;
for( i = 3; i >= 1; i--) if(d[d[0]]>=ten[i]) break;
tmp = d[d[0]];
for(j = i; j>=0; j--){
s=s+(char)(tmp/ten[j]+'0');
tmp%=ten[j];
}
for(i = d[0]-1; i>0; i--){
tmp = d[i];
for(j = 3; j >=0 ;j--){
s = s+(char)(tmp/ten[j]+'0');
tmp%=ten[j];
}
}
return s;
}
};
BigNum operator + (BigNum a,BigNum b){
BigNum c;
c.d[0] = max(a.d[0],b.d[0]);
int x=0;
for(int i = 1; i <= c.d[0]; i++){
x = a.d[i]+b.d[i]+x;
c.d[i] = x%10000;
x/=10000;
}
while(x!=0){
c.d[++c.d[0]]=x%10000;
x/=10000;
}
return c;
}
BigNum operator * (BigNum a,BigNum b){
BigNum c;
c.d[0] = a.d[0]+b.d[0];
for(int i = 1; i<= a.d[0]; i++){
int x = 0;
for(int j = 1; j <= b.d[0]; j++){
x = a.d[i]*b.d[j]+x+c.d[i+j-1];
c.d[i+j-1]=x%10000;
x/=10000;
}
c.d[i+b.d[0]]=x;
}
while((c.d[0]>1)&&(c.d[c.d[0]]==0)) --c.d[0];
return c;
}