[BZOJ2875] [NOI2012] 随机数生成器 - 矩阵快速幂

    很简单的一道题啊qwq,构造矩阵然后乱搞搞就A了。(讲道理我一开始两个unsigned long long相乘写错了qwq,矩阵就是这样的:

|a 1| |Xn 0|             |Xn+1 0|

|0 1| |c   0|             |c        0|

#include"stdio.h"
#include"iostream"
using namespace std;
typedef unsigned long long ll;

ll mod,a,c,x0,n,Mod;
const ll maxint=1<<31;

inline ll mul(ll a,ll b){ 
    ll c=0,aa=0,d=a; while(d) c=c*10+d%10,d/=10;
    while(a) aa=(aa*10+(c%10*b))%mod,c/=10,a/=10;
    return aa;
}
struct matrix{
    ll m[2][2]; matrix(){}
    matrix(ll c0,ll c1,ll c2,ll c3)
    { m[0][0]=c0,m[0][1]=c1,m[1][0]=c2,m[1][1]=c3;}
    matrix friend operator *
     (const matrix&a,const matrix&b){
         matrix c
          ( (mul(a.m[0][0],b.m[0][0])+mul(a.m[0][1],b.m[1][0]))%mod,
            (mul(a.m[0][0],b.m[0][1])+mul(a.m[0][1],b.m[1][1]))%mod,
            (mul(a.m[1][0],b.m[0][0])+mul(a.m[1][1],b.m[1][0]))%mod,
            (mul(a.m[1][0],b.m[0][1])+mul(a.m[1][1],b.m[1][1]))%mod );
         return c;
     }
};

int main(){
    cin>>mod>>a>>c>>x0>>n>>Mod;
    matrix k(1,0,0,1),ans(x0,0,c,0),po(a,1,0,1);
    while (n){
        if(n%2)k=k*po;
        po=po*po; n>>=1;
    }
    ans=k*ans;
    cout<<ans.m[0][0]%Mod<<endl;
    return 0;
}


你可能感兴趣的:([BZOJ2875] [NOI2012] 随机数生成器 - 矩阵快速幂)