博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

高精度模板

  我其实只是存个模板……
     真的只是存个模板……
     而已啦……
     支持高精度加减乘除以及快速幂……但是没有负数……(少用而且不想写……要的话自己写写符号位……)

 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int bi=1e4,MN=300;
char c[1001];
struct big{
    int a[MN];
    inline big(){
        memset(a,0,sizeof(a));
        a[0]=1;
    }
    inline void read(){
        register int i,j,k;
        memset(a,0,sizeof(a));
        scanf("%s",c);k=strlen(c);
        a[0]=(k+3)/4;
        for (i=0;i<k;i++) j=(k-i+3)/4,a[j]=a[j]*10+c[i]-48;
    }
    inline void pr(){
        register int i;
        printf("%d",a[a[0]]);
        for (i=a[0]-1;i;i--) printf("%04d",a[i]);
    }
    inline big operator =(int x){
        if (x==0){
            memset(a,0,sizeof(a));
            a[0]=1;
        }
        a[0]=0;
        while (x){
            a[0]++;
            a[a[0]]=x%bi;
            x/=bi;
        }
        if (!a[0]) a[0]=1;
    }
    inline big(int x){
        *this=x;
    }
    inline void gl(){
        while(!a[a[0]]&&a[0]>1) a[0]--;
    }
    inline void operator =(big x){
        register int i;
        a[0]=x.a[0];
        for (i=1;i<=a[0];i++) a[i]=x.a[i];
    }
    inline bool operator >(big y){
        if (a[0]!=y.a[0]) return a[0]>y.a[0];
        for (register int i=a[0];i;i--){
            if (a[i]!=y.a[i]) return a[i]>y.a[i];
        }
        return 0;
    }
    inline bool operator >=(const big y){
        if (a[0]!=y.a[0]) return a[0]>y.a[0];
        for (register int i=a[0];i;i--){
            if (a[i]!=y.a[i]) return a[i]>y.a[i];
        }
        return 1;
    }
    inline bool operator <(big y){
        if (a[0]!=y.a[0]) return a[0]<y.a[0];
        for (register int i=a[0];i;i--){
            if (a[i]!=y.a[i]) return a[i]<y.a[i];
        }
        return 0;
    }
    inline bool operator <=(big y){
        if (a[0]!=y.a[0]) return a[0]<y.a[0];
        for (register int i=a[0];i;i--){
            if (a[i]!=y.a[i]) return a[i]<y.a[i];
        }
        return 1;
    }
    inline bool operator ==(big y){
        if (a[0]!=y.a[0]) return 0;
        for (register int i=a[0];i;i--){
            if (a[i]!=y.a[i]) return 0;
        }
        return 1;
    }
    inline bool operator !=(big y){
        return !(*this==y);
    }
    inline bool operator ==(int y){
        big x=y;
        return *this==x;
    }
    inline bool operator !=(int y){
        return !(*this==y);
    }
    inline void swap(big &a,big &b){
        big x=a;a=b;b=x;
    }
    inline big operator +(big x){
        big r;
        if (a[0]<x.a[0]) r.a[0]=x.a[0];else r.a[0]=a[0];
        for (register int i=1;i<=r.a[0];i++) r.a[i]=(i<=a[0]?a[i]:0)+(i<=x.a[0]?x.a[i]:0);
        for (register int i=1;i<=r.a[0];i++)
        if (r.a[i]>=bi){
            r.a[i]-=bi;r.a[i+1]++;
            if (i==r.a[0]) r.a[0]++;
        }
        return r;
    }
    inline big operator +(int x){
        big r;r=*this;
        r.a[1]+=x;
        for (register int i=1;i<=r.a[0];i++)
        if (r.a[i]>=bi){
            r.a[i]-=bi;r.a[i+1]++;
            if (i==r.a[0]) r.a[0]++;
        }else break;
        return r;
    }
    inline big operator -(big x){
        if (*this<x) swap(*this,x);
        register int i;
        big r;
        if (a[0]<x.a[0]) r.a[0]=x.a[0];else r.a[0]=a[0];
        for (i=1;i<=r.a[0];i++) r.a[i]=a[i]-(i<=x.a[0]?x.a[i]:0);
        for (i=1;i<=r.a[0];i++)
        if (r.a[i]<0){
            r.a[i+1]--;r.a[i]+=bi;
        }
        r.gl();
        return r;
    }
    inline big operator -(int x){
        register int i=1;
        big r;r=*this;
        r.a[1]-=x;
        while (r.a[i]<0) r.a[i+1]--,r.a[i]+=bi,i++;
        r.gl();
        return r;
    }
    inline big operator *(big y){
        register int i,j;
        big r;r.a[0]=a[0]+y.a[0]-1;
        for (i=1;i<=a[0];i++)
        for (j=1;j<=y.a[0];j++){
            r.a[i+j-1]+=a[i]*y.a[j];
            if (r.a[i+j-1]>=bi){
                r.a[i+j]+=r.a[i+j-1]/bi;
                r.a[i+j-1]%=bi;
                if (i+j-1==r.a[0]) r.a[0]++;
            }
        }
        for (i=1;i<=r.a[0];i++)
        if (r.a[i]>=bi){
            r.a[i+1]+=r.a[i]/bi;
            r.a[i]%=bi;
            if (i==r.a[0]) r.a[0]++;
        }
        return r;
    }
    inline big operator *(int y){
        register int i,j;
        big r;r.a[0]=a[0];
        for (i=1;i<=a[0];i++)
        r.a[i]=a[i]*y;
        for (i=1;i<=r.a[0];i++)
        if (r.a[i]>=bi){
            r.a[i+1]+=r.a[i]/bi;
            r.a[i]%=bi;
            if (i==r.a[0]) r.a[0]++;
        }
        return r;
    }
    inline big half(){
        register int i,j;big r=*this;
        for (i=r.a[0];i>1;i--) r.a[i-1]+=(r.a[i]%2)*bi,r.a[i]>>=1;
        r.a[1]>>=1;
        r.gl();
        return r;
    }
    inline big operator /(big y){
        register int i,j;
        big r,l,mid,rq=*this;
        r.a[0]=rq.a[0]+1;r.a[r.a[0]]=1;
        while(r>l){
            mid=(l+r+big(1)).half();
            if (mid*y<=rq) l=mid;else r=mid-big(1);
        }
        return l;
    }
    inline big operator %(big y){
        register int i,j;
        big rq=*this;
        return rq-(rq/y*y);
    }
    inline big operator ^(int y){
        big ans=1;
        big rq=*this;
        while(y){
            if (y&1) ans=ans*rq;
            y>>=1;
            rq=rq*rq;
        }
        return ans;
    }
    inline big operator ^(big y){
        big ans=1;
        big rq=*this;
        while(y!=0){
            if (y.a[1]&1) ans=ans*rq;
            y=y/2;
            rq=rq*rq;
        }
        return ans;
    }
};
int main(){
}
View Code

 

  这是一个int128模版,用两个unsigned long long存储

#define ll unsigned long long
ll M[2315];
struct MMH{
    ll a,b;
    MMH(ll _a=0,ll _b=0):a(_a),b(_b){}
    void half(){
        b>>=1;
        if (a&1) b|=1ull<<63;
        a>>=1;
    }
    void two(){
        a<<=1;
        if (b&(1ull<<63)) a|=1;
        b<<=1;
    }
};
MMH operator +(const MMH &x,const MMH &y){
    MMH z;
    z.a=x.a+y.a;z.b=x.b+y.b;if (z.b<x.b||z.b<y.b) z.a++;
    return z;
}
MMH operator +(const MMH &x,const int &y){
    MMH z=x;
    if ((z.b+y)<z.b) z.a++;z.b+=y;
    return z;
}
MMH operator -(const MMH &x,const MMH &y){
    MMH z;
    z.a=x.a-y.a;z.b=x.b-y.b;if (y.b>x.b) z.a--;
    return z;
}
MMH operator -(const MMH &x,const int &y){
    MMH z=x;
    if (z.b<y) z.a--;z.b-=y;
    return z;
}
bool operator <(const MMH &x,const MMH &y){return x.a==y.a?x.b<y.b:x.a<y.a;}
bool operator >(const MMH &x,const MMH &y){return x.a==y.a?x.b>y.b:x.a>y.a;}
bool operator !=(const MMH &x,const MMH &y){return x.a!=y.a||x.b!=y.b;}
bool operator ==(const MMH &x,const MMH &y){return x.a==y.a&&x.b==y.b;}
MMH operator *(const MMH &x,const MMH &y){
    if (x.a){
        TTT++;
        SSS-=clock();
        MMH z=x,mmh=MMH(0,0),u=y;
        while (u.a|u.b){
            if (u.b&1) mmh=mmh+z;
            z.two();u.half();_mmh++;
        }
        SSS+=clock();
        return mmh;
    }
    ll s=(1ull<<32)-1;
    ll a=(x.b>>32)*(y.b>>32),_b1=(x.b&s)*(y.b>>32),b=_b1+(x.b>>32)*(y.b&s),c=(x.b&s)*(y.b&s),d;
    a+=(b<_b1)*1ull<<32;
    d=c+((b&s)<<32);a+=d<c;a+=b>>32;
    return MMH(a,d);
}
View Code

 

posted @ 2016-01-22 14:07  swm_sxt  阅读(257)  评论(0编辑  收藏  举报