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 洗牌 题解 快速幂 快速乘