1、压位高精度模板
struct largenum{
ll num[1005];
//输入
inline void scan(){
char s[10005];
scanf("%s",s+1);
memset(num,0,sizeof(num));
int len=strlen(s+1);
for(int i=len;i>=1;i-=8){
int j=max(i-7,1),res=0;
while(j<=i){
res=res*10+s[j++]-'0';
}
num[++num[0]]=res;
}
}
//输出
inline void print(){
printf("%lld",num[num[0]]);
for(int i=num[0]-1;i>=1;i--){
printf("%07lld",num[i]);
}
printf("\n");
}
//判相等
bool operator == (const largenum &tmp)const{
if(num[0]!=tmp.num[0]) return false;
for(int i=num[0];i>=1;i--){
if(num[i]!=tmp.num[i]) return false;
}
return true;
}
//判小于
bool operator < (const largenum &tmp)const{
if(num[0]>tmp.num[0]) return false;
if((*this)==tmp) return false;
if(num[0]=1;i--){
if(num[i]>tmp.num[i]) return false;
if(num[i] (const largenum &tmp)const{
if((*this)1) res.num[0]--;
return res;
}
//低精乘法
largenum operator * (const ll &tmp)const{
largenum res;
memset(res.num,0,sizeof(res.num));
res.num[0]=num[0];
ll laz=0;
for(int i=1;i<=res.num[0];i++){
res.num[i]=num[i]*tmp+laz;
laz=res.num[i]/base;
res.num[i]=res.num[i]%base;
}
while(laz){
res.num[++res.num[0]]=laz%base;
laz/=base;
}
while(!res.num[res.num[0]]&&res.num[0]>1) res.num[0]--;
return res;
}
//高精乘法
largenum operator * (const largenum &tmp){
largenum res;
memset(res.num,0,sizeof(res.num));
res.num[0]=num[0]+tmp.num[0];
for(int i=1;i<=num[0];i++){
for(int j=1;j<=tmp.num[0];j++){
res.num[i+j-1]+=num[i]*tmp.num[j];
res.num[i+j]+=res.num[i+j-1]/base;
res.num[i+j-1]=res.num[i+j-1]%base;
}
}
while(!res.num[res.num[0]]&&res.num[0]>1) res.num[0]--;
return res;
}
//低精除法
largenum operator / (const ll &tmp)const{
largenum res;
memset(res.num,0,sizeof(res.num));
res.num[0]=num[0];
ll laz=0;
for(int i=res.num[0];i>=1;i--){
res.num[i]=(laz*base+num[i])/tmp;
laz=(laz*base+num[i])%tmp;
}
while(!res.num[res.num[0]]&&res.num[0]>1) res.num[0]--;
return res;
}
//低精模运算
ll operator % (const ll &tmp)const{
ll laz=0;
for(int i=num[0];i>=1;i--){
laz=(laz*base+num[i])%tmp;
}
return laz;
}
//高精除法
largenum operator / (const largenum &tmp)const{
largenum res,cpy;
memset(res.num,0,sizeof(res.num));
memset(cpy.num,0,sizeof(cpy.num));
ll len=num[0];
res.num[0]=1,res.num[1]=0;
cpy=res;
if((*this)=1;i--){
cpy=cpy*base;
cpy.num[1]=num[i];
int cnt=0;
while(cpy>tmp||cpy==tmp){
cpy=cpy-tmp;
cnt++;
}
res.num[i]=cnt;
}
while(!res.num[len]&&len>1) len--;
res.num[0]=len;
return res;
}
//高精模运算
largenum operator % (const largenum &tmp)const{
largenum cpy;
memset(cpy.num,0,sizeof(cpy.num));
ll len=num[0];
cpy.num[0]=1,cpy.num[1]=0;
if((*this)=1;i--){
cpy=cpy*base;
cpy.num[1]=num[i];
while(cpy>tmp||cpy==tmp){
cpy=cpy-tmp;
}
}
return cpy;
}
};