码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj2875: [Noi2012]随机数生成器

时间:2016-06-16 21:40:46      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

矩阵乘法。

 

x[n] = {x[0],1} * ( {a,0} ^ n )

                          {b,1}

 

写成这样谁能看懂。。。。

noi里的大水题。我居然

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define LL long long 
using namespace std;
const int maxn = 2;

LL a,b,mod,g,x,n,ans;

LL mul(long long a,long long b) {
        a%=mod; b%=mod;
        long long res=0;
        while(b) {
            if(b&1) res=(res+a)%mod;
            a=(a+a)%mod;
            b>>=1;
        }
        return res;
    }

struct Matrix {
    const static LL n = 1;
    LL a[maxn][maxn];
    
    inline LL* operator [] (int x) {
        return a[x];
    }
    
    Matrix operator* (Matrix b) {
        Matrix res;
        for(int i=0;i<=n;i++)
        for(int j=0;j<=n;j++)
        for(int k=0;k<=n;k++) 
            res[i][k]=(res[i][k]+mul(a[i][j],b[j][k]))%mod;
        return res;
    }
    
    void build() {
        for(int i=0;i<=n;i++) a[i][i]=1;
    }
    
    Matrix operator^ (long long e) {
        Matrix res,tmp=*this;
        res.build();
        while(e) {
            if(e&1) res=res*tmp;
            tmp=tmp*tmp;
            e>>=1;
        }
        return res;
    }

    Matrix () {
        memset(a,0,sizeof(a));
    }
}res;


int main() {
    cin >> mod >> a >> b >> x >> n >> g;
    res[0][0]=a; res[1][0]=b; res[1][1]=1;
    res=res^n;
    ans=(mul(x,res[0][0])+res[1][0])%mod;
    ans=ans%g;
    cout << ans <<\n;
    return 0;    
}

都1A了。

bzoj2875: [Noi2012]随机数生成器

标签:

原文地址:http://www.cnblogs.com/invoid/p/5592104.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!