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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值