模板-普通高精度类
类 X 结构体 ✓
namespace是为了方便收纳用的(等于没开)
namespace cr_Bigint
{
/*
*无符号高精度整数模板
*/
const int Ba=10000;//压四位高精度数
const int NL=114514;
struct Bigint
{
int bit[NL],len;
Bigint(){memset(bit,0,NL*4);}
Bigint(int _len){len=_len; memset(bit,0,NL*4);}
//Bigint(ll t){for(;t;){bit[++len]=t%10000;t/=10000;}}
};
inline Bigint LLToBigint(ll t)
{
Bigint c(0);
for(;t;){c.bit[++c.len]=t%10000;t/=10000;}
return c;
}
//IO
char temp[191981];
inline void ReadBigint(Bigint& a)
{
scanf("%s",temp);
int lent=strlen(temp);
a.len=1;
for(int i=lent-1,p=1,s=1;i>=0;--i,s*=10)
{
a.bit[p]+=(temp[i]-'0')*s;
if(s==10000)
{
a.bit[p+1]=a.bit[p]/10000, a.bit[p]%=10000, a.len++;
p++,s=1;
}
}
for(;!a.bit[a.len] && a.len>=1;--a.len);
}
inline void WriteBigint(Bigint a)
{
sprintf(temp,"%d",a.bit[a.len]);
for(int i=a.len-1;i>0;--i) sprintf(temp,"%s%04d",temp,a.bit[i]);
printf("%s\n",temp);
}
inline void DebugBigint(Bigint a)
{
printf("len:%d\n",a.len);
for(int i=1;i<=a.len;++i) printf("Bit%d=%d\n",i,a.bit[i]);
}
//compare
bool operator== (const Bigint& a,const Bigint& b)
{
if(a.len!=b.len) return false;
for(int i=a.len;i>0;--i) if(a.bit[i]!=b.bit[i]) return false;
return true;
}
bool operator< (const Bigint& a,const Bigint& b)
{
if(a.len<b.len) return true;
if(a.len>b.len) return false;
for(int i=a.len;i>0;--i) if(a.bit[i]!=b.bit[i]) return a.bit[i]<b.bit[i];
return false;
}
bool operator<= (const Bigint& a,const Bigint& b)
{
if(a.len<b.len) return true;
if(a.len>b.len) return false;
for(int i=a.len;i>0;--i) if(a.bit[i]!=b.bit[i]) return a.bit[i]<b.bit[i];
return true;
}
bool operator> (const Bigint& a,const Bigint& b){return !(a<=b);}
bool operator>= (const Bigint& a,const Bigint& b){return !(a<b);}
bool operator!= (const Bigint& a,const Bigint& b){return !(a==b);}
//加减法
Bigint operator+ (const Bigint& a,const Bigint& b)
{
Bigint c(max(a.len,b.len));
for(int i=1;i<=c.len;++i)
{
c.bit[i]+=a.bit[i]+b.bit[i];
c.bit[i+1]+=c.bit[i]/10000, c.bit[i]%=10000;
}
if(c.bit[c.len+1]) ++c.len;
return c;
}
Bigint operator+ (const Bigint& a,const ll& b){return a+LLToBigint(b);}
Bigint operator- (const Bigint& a,const Bigint& b)
{
Bigint c(max(a.len,b.len));
for(int i=c.len;i>0;--i)
{
c.bit[i]=a.bit[i]-b.bit[i];
for(int j=i;j<=c.len;++j)
if(c.bit[j]>=0) break;
else --c.bit[j+1],c.bit[j]+=10000;
}
if(!c.bit[c.len]&&c.len>1) --c.len;
return c;
}
Bigint operator- (const Bigint& a,const ll& b){return a-LLToBigint(b);}
//乘法
Bigint operator* (const Bigint& a,const Bigint& b)
{
Bigint c(a.len+b.len-1);
for(int i=1;i<=a.len;++i)
for(int j=1;j<=b.len;++j)
{
c.bit[i+j-1]+=a.bit[i]*b.bit[j];
c.bit[i+j]+=c.bit[i+j-1]/10000, c.bit[i+j-1]%=10000;
}
for(;c.bit[c.len+1];++c.len);
return c;
}
Bigint operator* (const Bigint& a,const ll& b){return a*LLToBigint(b);}
//除法
Bigint divR(Bigint a,int b,int& r)
{
Bigint c(a.len);
for(int i=a.len;i>0;--i)
c.bit[i]=a.bit[i]/b, a.bit[i-1]+=a.bit[i]%b*10000;
for(;!c.bit[c.len]&&c.len>1;--c.len);
r=a.bit[0]/10000;
return c;
}
void ry(Bigint& a)//右移
{
for(int i=a.len;i>0;--i)
{
if((a.bit[i]&1) && i>1) a.bit[i-1]+=10000;
a.bit[i]>>=1;
}
if(!a.bit[a.len]&&a.len>1) --a.len;
}
void ly(Bigint& a)//左移
{
for(int i=1;i<=a.len+1;++i)
{
a.bit[i]<<=1;
if(a.bit[i-1]>=10000) a.bit[i-1]-=10000,++a.bit[i];
}
if(a.bit[a.len+1]) ++a.len;
}
Bigint divR(Bigint a,Bigint b,Bigint& r)
{
Bigint cp=LLToBigint(1),c(abs(a.len-b.len+1));
for(;a>=b; ly(b),ly(cp));
for(;cp.len>1 || cp.bit[1]; ry(b),ry(cp))
if(a>=b) a=a-b, c=c+cp;
for(;!c.bit[c.len]&&c.len>1;--c.len);
r=a;
return c;
}
//end
} using namespace cr_Bigint;

浙公网安备 33010602011771号