壓8位高精度模板
阿新 • • 發佈:2019-01-03
#define LL long long int
struct bignum
{
LL num[MAXN] ;
void init()
{
memset(num,0,sizeof num);
}
bool operator < (const bignum &a)const
{
if(num[0]!=a.num[0])return num[0]<a.num[0];
for(int i=num[0];i>0;--i)
if(num[i]!=a.num[i])
return num[i]<a.num[i];
return 0;
}
void operator += (const LL &a)
{
num[1]+=a ;
for(int i=1;i<=num[0];++i)
{
num[i+1]+=num[i]/mod;
num[i]%=mod;
}
while(num[num[0]+1]>0)++num[0];
}
bignum operator + (const LL a)const
{
bignum temp=*this;
temp+=a;
return temp ;
}
void operator += (const bignum &a)
{
num[0]=max(num[0],a.num[0]);
for(int i=1;i<=num[0];++i)
{
num[i]+=a.num[i];
num[i+1]+=num[i]/mod;
num[i]%=mod;
}
while (num[num[0]+1]>0)++num[0];
}
bignum operator + (const bignum &a)const
{
bignum temp=*this;
temp+=a;
return temp;
}
void operator -= (const LL &a)
{
num[1]-=a;
for(int i=1;num[i]<0&&i<=num[0];++i)
while(num[i]<0)
{
num[i]+=mod;
--num[i+1];
}
while(num[num[0]]<=0&&num[0]>0)--num[0];
}
bignum operator - (const LL &a)const
{
bignum temp=*this;
temp-=a;
return temp ;
}
void operator -= (const bignum &a)
{
for(int i=1;i<=num[0];++i)
{
num[i]-=a.num[i];
while(num[i]<0)
{
num[i]+=mod ;
--num[i+1];
}
}
while(num[num[0]]<=0&&num[0]>0)--num[0];
}
bignum operator - (const bignum &a)const
{
bignum temp=*this;
temp-=a;
return temp;
}
void operator *= (const LL &a)
{
for(int i=1;i<=num[0];++i)
num[i]*=a;
for(int i=1;i<=num[0];++i)
{
num[i+1]+=num[i]/mod;
num[i]%=mod;
}
}
bignum operator * (const LL &a)const
{
bignum temp=*this;
temp*=a;
return temp;
}
bignum operator * (const bignum &a)const
{
bignum c;
c.init();
c.num[0]=num[0]+a.num[0]-1;
for(int i=1;i<=num[0];++i)
for(int j=1;j<=a.num[0];++j)
c.num[i+j-1]+=num[i]*a.num[j];
for(int i=1;i<=c.num[0];++i)
{
c.num[i+1]+=c.num[i]/mod;
c.num[i]%=mod;
}
while(c.num[c.num[0]+1]>0)
{
++c.num[0];
c.num[c.num[0]+1]+=c.num[c.num[0]]/mod;
c.num[c.num[0]]%=mod;
}
return c;
}
void operator *= (const bignum &a)
{
bignum c=*this;
c=c*a;
*this=c;
}
void operator /= (const LL &a)
{
for(int i=num[0];i>1;--i)
{
num[i-1]+=(num[i]%a*mod);
num[i]/=a;
}
num[1]/=a;
while(num[0]>0&&num[num[0]]<=0)--num[0];
}
bignum operator / (const LL &a)const
{
bignum temp=*this ;
temp/=a;
return temp;
}
void operator %= (const LL &a)
{
bignum temp=*this;
temp=temp-temp/a*a;
*this=temp;
}
bignum operator % (const LL &a)const
{
bignum temp=*this;
temp%=a;
return temp;
}
void operator /=(const bignum &a){
bignum l ,m ,r =*this;
l.init();
l.num[0]=1 ;
while(l<r)
{
m=(l+r+1)/2;
if(*this<(a*m)) r=m-1;
else l=m;
}
*this=l;
}
bignum operator / (const bignum &a)const
{
bignum temp=*this;
temp/=a;
return temp;
}
void operator %= (const bignum &a)
{
bignum c=*this;
c=c-c/a*a;
*this=c;
}
bignum operator % (const bignum &a)const
{
bignum c=*this;
c%=a;
return c;
}
void read()
{
scanf("%s",word);
int len=strlen(word) ;
for(int i=0;i<len;++i)
num[(len-i-1)/8+1]=num[(len-i-1)/8+1]*10+word[i]-'0' ;
num[0]=(len-1)/8+1 ;
}
void put()
{
printf("%I64d",num[num[0]]);
for(int i=num[0]-1;i>0;--i)
printf("%08I64d",num[i]);
puts("");
}
}