[模板] 高精度加/减/乘

//tbig[0]: the length of num

const int bsz=20050,blk=10000;
struct tbig{
    int val[bsz];
    tbig(){cl();}
    tbig(int v){set(v);}
    void cl(){memset(val,0,sizeof(val));}
    void set(int v){
        cl();
        while(v){val[++val[0]]=v%blk;v/=blk;}
    }
    int& operator[](int p){return val[p];}
    void pr(){
        printf("%d",val[val[0]]);
        repdo(i,val[0]-1,1){
            printf("%04d",val[i]);
        }
    }
};
tbig operator+(tbig l,tbig r){
    tbig res;
    res[0]=max(l[0],r[0]);
    rep(i,1,res[0]){
        res[i]+=l[i]+r[i];
        if(res[i]>blk)res[i]-=blk,res[i+1]++;
    }
    while(res[res[0]+1])++res[0];
    return res;
}
tbig operator*(tbig l,tbig r){//no fft,no bugs
    tbig res;
    rep(i,1,l[0]){
        rep(j,1,r[0]){
            res[i+j-1]+=l[i]*r[j];
            if(res[i+j-1]>blk)res[i+j]+=res[i+j-1]/blk,res[i+j-1]%=blk;
        }
    }
    res[0]=l[0]+r[0]+1;
    while(res[res[0]]==0)--res[0];
    return res;
}

举个栗子:

tbig a(int a,int b){
    if(b>a)return 0; //important
    tbig res(1);
    rep(i,1,b)res=res*(a-i+1);
    return res;
}

猜你喜欢

转载自www.cnblogs.com/ubospica/p/9838797.html
今日推荐