bzoj2875随机数生成器

Posted Narh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj2875随机数生成器相关的知识,希望对你有一定的参考价值。

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2875

矩阵乘裸题。

如果直接乘的话会爆long long,所以用加法代替乘,过程中不断取模。

加法应是快速乘,不要O(n)循环……

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
ll n,m,g,a,c,ans,x;
ll mul(ll u,ll v)
{
    ll ret=0,tp=u;
    while(v)
    {
        if(v&1)(ret+=tp)%=m;
        (tp+=tp)%=m;v>>=1;
    }
    return ret;
}
struct Matrix{
    ll v[2][2];
    Matrix operator *(const Matrix &b)const
    {
        Matrix tp;memset(tp.v,0,sizeof tp.v);
        for(int i=0;i<=1;i++)
            for(int j=0;j<=1;j++)
                for(int k=0;k<=1;k++)
                    (tp.v[i][j]+=mul(v[i][k],b.v[k][j]))%=m;
        return tp;
    }
}res,ct;
void init()
{
    scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x,&n,&g);
    n--;
    res.v[0][0]=a;res.v[0][1]=1;
    res.v[1][0]=0;res.v[1][1]=1;
    memcpy(ct.v,res.v,sizeof res.v);
}
int main()
{
    init();
    while(n)
    {
        if(n&1)res=res*ct;
        ct=ct*ct;n>>=1;
    }
    ans=(mul(res.v[0][0],x)+mul(res.v[0][1],c))%m%g;
    printf("%lld",ans);
    return 0;
}

 

以上是关于bzoj2875随机数生成器的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 2875 [Noi2012]随机数生成器 矩阵乘法

bzoj2875随机数生成器

bzoj2875: [Noi2012]随机数生成器

[bzoj 2875][noi2012]随机数生成器

BZOJ2875 [Noi2012]随机数生成器

bzoj1633 / P2875 [USACO07FEB]牛的词汇The Cow Lexicon