随笔——一些性质探究和总结


1、压位高精度模板

struct largenum{
    ll num[1005];
    //输入
    inline void scan(){
        char s[10005];
        scanf("%s",s+1);
        memset(num,0,sizeof(num));
        int len=strlen(s+1);
        for(int i=len;i>=1;i-=8){
            int j=max(i-7,1),res=0;
            while(j<=i){
                res=res*10+s[j++]-'0';
            }
            num[++num[0]]=res;
        }
    }
    //输出
    inline void print(){
        printf("%lld",num[num[0]]);
        for(int i=num[0]-1;i>=1;i--){
            printf("%07lld",num[i]);
        }
        printf("\n");
    }
    //判相等
    bool operator == (const largenum &tmp)const{
        if(num[0]!=tmp.num[0]) return false;
        for(int i=num[0];i>=1;i--){
            if(num[i]!=tmp.num[i]) return false;
        }
        return true;
    }
    //判小于
    bool operator < (const largenum &tmp)const{
        if(num[0]>tmp.num[0]) return false;
        if((*this)==tmp) return false;
        if(num[0]=1;i--){
            if(num[i]>tmp.num[i]) return false;
            if(num[i] (const largenum &tmp)const{
        if((*this)1) res.num[0]--;
        return res;
    }
    //低精乘法
    largenum operator * (const ll &tmp)const{
        largenum res;
        memset(res.num,0,sizeof(res.num));
        res.num[0]=num[0];
        ll laz=0;
        for(int i=1;i<=res.num[0];i++){
            res.num[i]=num[i]*tmp+laz;
            laz=res.num[i]/base;
            res.num[i]=res.num[i]%base;
        }
        while(laz){
            res.num[++res.num[0]]=laz%base;
            laz/=base;
        }
        while(!res.num[res.num[0]]&&res.num[0]>1) res.num[0]--;
        return res;
    }
    //高精乘法
    largenum operator * (const largenum &tmp){
        largenum res;
        memset(res.num,0,sizeof(res.num));
        res.num[0]=num[0]+tmp.num[0];
        for(int i=1;i<=num[0];i++){
            for(int j=1;j<=tmp.num[0];j++){
                res.num[i+j-1]+=num[i]*tmp.num[j];
                res.num[i+j]+=res.num[i+j-1]/base;
                res.num[i+j-1]=res.num[i+j-1]%base;
            }
        }
        while(!res.num[res.num[0]]&&res.num[0]>1) res.num[0]--;
        return res;
    }
    //低精除法
    largenum operator / (const ll &tmp)const{
        largenum res;
        memset(res.num,0,sizeof(res.num));
        res.num[0]=num[0];
        ll laz=0;
        for(int i=res.num[0];i>=1;i--){
            res.num[i]=(laz*base+num[i])/tmp;
            laz=(laz*base+num[i])%tmp;
        }
        while(!res.num[res.num[0]]&&res.num[0]>1) res.num[0]--;
        return res;
    }
    //低精模运算
    ll operator % (const ll &tmp)const{
        ll laz=0;
        for(int i=num[0];i>=1;i--){
            laz=(laz*base+num[i])%tmp;
        }
        return laz;
    }
    //高精除法
    largenum operator / (const largenum &tmp)const{
        largenum res,cpy;
        memset(res.num,0,sizeof(res.num));
        memset(cpy.num,0,sizeof(cpy.num));
        ll len=num[0];
        res.num[0]=1,res.num[1]=0;
        cpy=res;
        if((*this)=1;i--){
            cpy=cpy*base;
            cpy.num[1]=num[i];
            int cnt=0;
            while(cpy>tmp||cpy==tmp){
                cpy=cpy-tmp;
                cnt++;
            }
            res.num[i]=cnt;
        }
        while(!res.num[len]&&len>1) len--;
        res.num[0]=len;
        return res;
    }
    //高精模运算
    largenum operator % (const largenum &tmp)const{
        largenum cpy;
        memset(cpy.num,0,sizeof(cpy.num));
        ll len=num[0];
        cpy.num[0]=1,cpy.num[1]=0;
        if((*this)=1;i--){
            cpy=cpy*base;
            cpy.num[1]=num[i];
            while(cpy>tmp||cpy==tmp){
                cpy=cpy-tmp;
            }
        }
        return cpy;
    }
};