#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const int N=10050;
const int base=1e9;
char s[N]="";
struct Bint
{
ll num[N]; int len;
Bint(){memset(num,0,sizeof num); len=0;}
};
Bint operator +( const Bint &a, const Bint &b)
{
Bint ans;
int len=max(a.len,b.len);
for(int i=1;i<=len;i++)
{
ans.num[i]+=a.num[i]+b.num[i];//此处用+=因为要进位
ans.num[i+1]+=ans.num[i]/base; ans.num[i]=ans.num[i]%base;
}
ans.len=max(a.len,b.len);
if(ans.num[ans.len+1]) ans.len++;
return ans;
}
bool operator <(const Bint &a,const Bint &b)
{
if(a.len<b.len) return true;
if(a.len>b.len) return false;
for(int i=a.len;i>=1;i--)
{
if(a.num[i]>b.num[i]) return false;
if(a.num[i]<b.num[i]) return true;//比较大小
}
return false;
}
bool operator ==(const Bint &a,const Bint &b)
{
if(a.len!=b.len) return false;
for(int i=1;i<=a.len;i++)
if(a.num[i]!=b.num[i]) return false;
return true;
}
bool operator <=(const Bint &a,const Bint &b)
{
return a<b||a==b;
}
//a>b
Bint operator -(const Bint &a,const Bint &b)
{
Bint ans;
int len=max(a.len,b.len);
for(int i=len;i>=1;i--)
{
if(a.num[i]>=b.num[i]) ans.num[i]=a.num[i]-b.num[i];
else ans.num[i+1]--,ans.num[i]=a.num[i]+base-b.num[i];
}
while(!ans.num[len]) len--;
ans.len=len;
return ans;
}
Bint operator *(const Bint &a,const Bint &b)
{
Bint ans;
for(int i=1;i<=b.len;i++)//长度小
for(int j=1;j<=a.len;j++)//长度大
{
ans.num[i+j-1]+=b.num[i]*a.num[j];
ans.num[i+j]+=ans.num[i+j-1]/base;
ans.num[i+j-1]%=base;
}
ans.len=a.len+b.len+1;//乘法后的位数问题
while(!ans.num[ans.len]) ans.len--;
return ans;
}
Bint T(int x)
{
Bint ans;
ans.len=1; ans.num[1]=x;
return ans;
}
int find(Bint a,Bint b)
{
int l=0,r=base;
while(l+1<r)
{
int mid=(l+r)>>1;
if( b*T(mid)<=a ) l=mid;
else r=mid;
}
return l;
}
//a>b a/b
Bint operator /(const Bint &a,const Bint &b)
{
Bint ans,tmp;
for(int i=a.len;i>=1;i--)
{
tmp=tmp*T(base); tmp=tmp+T(a.num[i]);
if(tmp.len>=b.len) ans.num[i]=find(tmp,b);
tmp=tmp-( b*T(ans.num[i]));
}
ans.len=a.len-b.len+1;
while(!ans.num[ans.len]) ans.len--;
return ans;
}
//注意: 前导0
void print(Bint a)
{
printf("%lld",a.num[a.len]);
for(int i=a.len-1;i>=1;i--)
printf("%.9lld",a.num[i]);
}
//技巧: 从0开始就可以避免位移判断
Bint read()
{
Bint ans;
scanf("%s",s); int len=strlen(s);
for(int i=0;i<len;i++)
{
char c=s[i];
if(c>='0'&&c<='9')
{
int t=len-1-i;
ans.num[t/9+1]=ans.num[t/9+1]*10+c-'0';
}
}
ans.len=(len-1)/9+1;
return ans;
}