bool operator<(string a,string b){//判断string状态下的数字大小
if(a.size()!=b.size())
return a.size()<b.size();
for(int i=0;i<a.size();++i)
if(a[i]!=b[i])
return a[i]<b[i];
return 1;
}
void _0(string &x){//去除前导零
while(x.size() && x[0]=='0')
x.erase(x.begin());
if(!x.size()) x="0";
return ;
}
string operator+(string a,string b){//高精加
string ans="";
if(a.size()>b.size())
swap(a,b);
while(a.size()<b.size())
a='0'+a;
int j=0;
for(int i=a.size()-1;i>-1;--i){
int x=(a[i]+b[i]-'0'-'0')+j;
j=x/10;
ans=char(x%10+'0')+ans;
}
while(j){
ans=char(j%10+'0')+ans;
j/=10;
}
return ans;
}
string operator-(string a,string b){//高精减
string ans="";
bool s=0;
if(a<b){
swap(a,b);
s=1;
}
while(b.size()<a.size())
b='0'+b;
int j=0;
for(int i=a.size()-1;i>-1;--i){
int x=a[i]-b[i]-j;
j=0;
while(x<0) ++j,x+=10;
ans=char(x+'0')+ans;
}
while(ans.size() && ans[0]=='0')
ans.erase(ans.begin());
if(!ans.size()) ans="0";
if(ans!="0" && s) ans='-'+ans;
return ans;
}
string operator*(string a,string b){//高精乘,需高精加
string ans="";
int jin;
string dx,dy="";
for(int i=a.size()-1;i>-1;--i){
jin=0;
dx=dy;
for(int j=b.size()-1;j>-1;--j){
int x=(b[j]-'0')*(a[i]-'0')+jin;
jin=x/10;
ans=ans+(char(x%10+'0')+dx);
dx+='0';
}
while(jin){
ans=ans+(char(jin%10+'0')+dx);
dx+='0',jin/=10;
}
dy+='0';
}
return ans;
}
pair<string,string> operator/(string a,string b){//高精除,需高精加、减
pair<string,string>ans;
ans.first=ans.second="";
string dx="";
for(int i=0;i<a.size();++i){
dx+=a[i];
ans.first+='0';
while(b<dx){
ans.first=ans.first+(string)"1";
dx=dx-b;
}
}
ans.second=dx;//余数
while(ans.first.size() && ans.first[0]=='0')
ans.first.erase(ans.first.begin());
if(!ans.first.size())
ans.first="0";
return ans;
}
struct memr{
int c[400];
int h;//存储用了多长的数组
};
void mul(memr a,memr b,memr &d){
memset(d.c,0,sizeof(d.c));
d.h=-1;
for(re int i=0;i<=a.h;++i){
for(re int j=0;j<=b.h;++j){
long long dx=1ll*a.c[i]*b.c[j];
int id=i+j-1;
while(dx){
++id;
dx+=d.c[id];
d.c[id]=(dx%mod);
dx/=mod;
d.h=max(d.h,id);
}
}
}
return ;
}
int g(int x){
int cnt=0;
while(x){
++cnt;
x/=10;
}
return cnt;
}
void print(memr a){
for(re int i=a.h;i>-1;--i){
if(i!=a.h){
for(re int j=0;j<8-g(a.c[i]);++j)//输出记得补0
putchar('0');
}
printf("%d",a.c[i]);
}
return ;
}