[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;
}

  

猜你喜欢

转载自www.cnblogs.com/guangheli/p/9928946.html
今日推荐