1. 程式人生 > >壓8位高精度模板

壓8位高精度模板

#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(""); } }