luogu_P2044题解 随机数生成器 矩阵乘法

Posted chriskkk

tags:

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

题面:https://www.luogu.org/problem/P2044

矩阵乘法裸题。

关键在于base和ans矩阵。

经过计算待定系数可以得到。

ans =   (x0,1)  ,  (0,0) 

base =   (a,0)  ,  (c,1) 

如代码所示。

然后就可以快乐的矩阵乘法了!

但是还有一个事。

大数据不要忘了龟速乘!

不然会爆炸成50分。

代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll mod,a,c,xx,n,g;
struct node
    ll m[5][5];
ans,base;
inline ll qm(ll x,ll y)
    ll res=0;
    while(y)
        if(y&1) res=(res+x)%mod;
        x=(x+x)%mod;
        y>>=1;
    
    return res;

inline node mul(node x,node y)
    node res;
    memset(res.m,0,sizeof(res.m));
    for(int i=1;i<=2;i++)
        for(int k=1;k<=2;k++)
            if(!x.m[i][k]) continue;
            for(int j=1;j<=2;j++)
                res.m[i][j]+=qm(x.m[i][k],y.m[k][j]);
                res.m[i][j]%=mod;
            
        
    return res;

inline void qp(ll p)
    while(p)
        if(p&1) ans=mul(ans,base);
        base=mul(base,base);
        p>>=1;
    

int main()

    scanf("%lld%lld%lld%lld%lld%lld",&mod,&a,&c,&xx,&n,&g);
    ans.m[1][1]=xx;ans.m[1][2]=1;
    base.m[1][1]=a;base.m[2][1]=c;base.m[2][2]=1;
    qp(n);
    printf("%lld\n",ans.m[1][1]%g);
    system("pause");
    return 0;

 

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

luogu_P2054 bzoj 1965 洗牌 题解 快速幂 快速乘

[题解](组合数/矩阵的前缀和)luogu_P2822组合数问题

[题解]luogu_P1627_中位数(排列乱搞

[题解](gcd/欧拉函数)luogu_P2568_GCD

[题解]数学期望_luogu_P1850_换教室

Luogu_P1516题解青蛙的约会 exgcd