• [NOI2012]随机数生成器 矩阵乘法


    Code:

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<string>
    using namespace std;
    void setIO(string a){ freopen((a+".in").c_str(),"r",stdin); }
    #define ll long long
    ll mod,g;
    int nodes;
    struct matrix{
        long long mat[2][2];
    }unit,solve,fin;
    void init(matrix &a){
        for(int i=0;i<=nodes;++i)
            for(int j=0;j<=nodes;++j) a.mat[i][j]=0;
    }
    void get(matrix &a){
        init(a);
        for(int i=0;i<=nodes;++i) a.mat[i][i]=1;
    }
    ll mult(ll a,ll b){
        ll res=0;
        while(b>0){
            if(b&1) res=(res+a)%mod;
            a=(a+a)%mod;
            b>>=1;
        }
        return res;
    }
    matrix operator*(matrix a,matrix b){
        matrix c;
        init(c);
        for(int i=0;i<=nodes;++i)
            for(int j=0;j<=nodes;++j)
                for(int k=0;k<=nodes;++k) 
                    c.mat[i][j]=(c.mat[i][j]+mult(a.mat[i][k],b.mat[k][j]))%mod;
        return c;
    }
    matrix operator^(matrix a,ll p){
        matrix res;
        get(res);
        while(p>0){
            if(p&1) res=res*a;
            a=a*a;
            p>>=1;
        }
        return res;
    }
    int main(){
        //setIO("input");
        nodes=1;
        ll a,c,x,n;
        cin>>mod>>a>>c>>x>>n>>g;
        init(unit),init(solve);
        unit.mat[0][0]=a,unit.mat[1][1]=1,unit.mat[1][0]=c;
        solve.mat[0][0]=x,solve.mat[0][1]=1;
        fin=solve*(unit^n);
        cout<<(fin.mat[0][0]%mod)%g;
        return 0;
    }
    

      

  • 相关阅读:
    3.14周末作业
    3.13作业
    文件处理
    字符编码
    基本数据类型总结
    基本数据类型--------------------集合set()
    python入门009
    作业009
    python入门008
    作业008
  • 原文地址:https://www.cnblogs.com/guangheli/p/9928946.html
Copyright © 2020-2023  润新知