高精度+矩阵乘法做法,不知道哪里出bug了
查看原帖
高精度+矩阵乘法做法,不知道哪里出bug了
378582
Jack_1218楼主2024/9/8 01:08

RT,只能AC前六个测试点,T了最后一个点我可以理解,运算量太大了,但WA了剩下三个点不太理解为什么,有没有人帮忙看看啊

#include<bits/stdc++.h>
using namespace std;
int tmp[100];
struct bigN{
    int num[100];
    int len;

    bigN(){
        memset(num,0,sizeof(num));
        len=0;
    }

    bigN(long long nn){
        if(nn==0){
            len=1;
            memset(num,0,sizeof(num));
        } else{
            memset(num,0,sizeof(num));
            len=0;
            while(nn){
                num[++len]=nn%10;
                nn/=10;
            }
        }
    }

    bigN operator + (const bigN &N) const{
        bigN ans;
        ans.len = max(len, N.len);
        for(int i=1;i<=ans.len;i++){
            ans.num[i] += num[i] + N.num[i];
            ans.num[i+1] += ans.num[i]/10;
            ans.num[i] %= 10;
        }
        if(ans.num[ans.len+1]) ans.len++;
        return ans;
    }

    bigN operator * (const bigN &N) const{
        bigN ans;
        ans.len=len+N.len-1;
        for(int i=1;i<=len;i++){
            for(int j=1;j<=N.len;j++){
                ans.num[i+j-1] += num[i]*N.num[j];
                ans.num[i+j] += ans.num[i+j-1]/10;
                ans.num[i+j-1] %= 10;
            }
        }
        if(ans.num[ans.len+1]) ans.len++;
        return ans;
    }
    
    bigN operator % (const long long &N) const{
        unsigned long long r=0;
        memset(tmp,0,sizeof(tmp));
        for(int i=1;i<=len;i++){
            tmp[i]=num[len-i+1];
        }
        for(int i=1;i<=len;i++){
            r=r*10+(unsigned long long)(tmp[i]);
            r%=N;
        }
        return bigN((long long)(r));
    }

    void print(){
        for(int i=len;i>=1;i--) cout<<num[i];
        cout<<endl;
    }
};

long long m,a,c,X0,n,g;

struct Matrix{
    bigN a[5][5];
    Matrix operator * (const Matrix &M) const{
        Matrix ans;
        for(int i=1;i<=2;i++){
            for(int j=1;j<=2;j++){
                for(int k=1;k<=2;k++){
                    ans.a[i][j]=(ans.a[i][j]+((a[i][k]%m)*(M.a[k][j]%m))%m)%m;
                }
            }
        }
        return ans;
    }
};

Matrix ksm(Matrix a, int b){
    Matrix res;
    for(int i=1;i<=2;i++) res.a[i][i]=bigN(1);
    while(b){
        if(b&1) res=res*a;
        a=a*a;
        b>>=1;
    }
    return res;
}

int main(){
    //freopen("a.in","r",stdin);
    //freopen("a.out","w",stdout);
    cin>>m>>a>>c>>X0>>n>>g;
    Matrix O;
    O.a[1][1]=bigN(a); O.a[1][2]=bigN(c);
    O.a[2][1]=bigN(0); O.a[2][2]=bigN(1);
    Matrix ANS = ksm(O,n);
    bigN RES = (((ANS.a[1][1]*(bigN(X0)%m))%m+ANS.a[1][2])%m)%g;
    RES.print();
    return 0;
}
2024/9/8 01:08
加载中...