bzoj2875 [noi2012]随机数生成器(矩阵倍增)
2017-08-10 23:31
309 查看
挺裸的矩阵倍增。。。就是再处理一下ll*ll.思想类似快速幂,例如对x*y,把x变成二进制,y去倍增,每次都mod m,变乘法为许多次加法,保证不会溢出。
#include <cstdio> #include <cstring> #define ll long long ll g,aa,c,x0,n,mod; inline ll mul(ll x,ll y){//ll*ll的处理 ll res=0; for(;x;x>>=1,y=(y+y)%mod) if(x&1) res=(res+y)%mod; return res; } struct matrix{ ll mat[2][2]; matrix(bool op){ memset(mat,0,sizeof(mat)); if(op) mat[0][0]=1,mat[1][1]=1; } matrix operator*(matrix b){ matrix res(0); for(int i=0;i<2;++i) for(int j=0;j<2;++j) fo 1183f r(int k=0;k<2;++k) res.mat[i][j]=(res.mat[i][j]+mul(mat[i][k],b.mat[k][j]))%mod; return res; } matrix operator^(ll k){ matrix res(1);matrix b(0); memcpy(b.mat,mat,sizeof(mat)); for(;k;k>>=1,b=b*b) if(k&1) res=res*b; return res; } }trans(0),a(0); int main(){ // freopen("a.in","r",stdin); scanf("%lld%lld%lld%lld%lld%lld",&mod,&aa,&c,&x0,&n,&g); a.mat[0][0]=x0;a.mat[0][1]=c; trans.mat[0][0]=aa;trans.mat[1][1]=trans.mat[1][0]=1; a=a*(trans^n); printf("%lld\n",a.mat[0][0]%g); return 0; }
相关文章推荐
- [BZOJ2875][NOI2012]随机数生成器(矩阵乘法)
- BZOJ2875: [Noi2012]随机数生成器 矩阵乘法+快速乘
- [BZOJ 2875][NOI 2012]随机数生成器(矩阵快速幂)
- BZOJ 2875: [Noi2012]随机数生成器【矩阵乘法优化递推
- [BZOJ2875] [NOI2012] 随机数生成器 - 矩阵快速幂
- [BZOJ 2875 & Vijos 1725] NOI 2012 随机数生成器 · 矩阵乘法+快速乘法
- Bzoj 2875: [Noi2012]随机数生成器(矩阵乘法)
- BZOJ 2875[Noi2012]随机数生成器(矩阵快速幂+小技巧)
- [BZOJ2875]NOI2012随机数生成器|矩阵乘法
- BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )
- BZOJ2875 [Noi2012]随机数生成器 【矩阵乘法 + 快速乘】
- [BZOJ2875][Noi2012]随机数生成器 && 矩阵+快速乘
- BZOJ2875: [Noi2012]随机数生成器 矩阵乘法+快速乘
- bzoj2875 [Noi2012]随机数生成器 [矩阵+快乘]
- 【矩阵乘法+快速乘】BZOJ2875-[NOI2012]随机数生成器
- 【BZOJ2875】[Noi2012]随机数生成器【矩阵快速幂】
- BZOJ 2875 NOI2012 随机数生成器 矩阵乘法
- 【BZOJ】2875: [Noi2012]随机数生成器(矩阵乘法+快速乘)
- 【bzoj2875】 Noi2012—随机数生成器
- BZOJ 2875 2875: [NOI2012]随机数生成器