【矩阵乘】【NOI 2012】【cogs963】随机数生成器
来源:互联网 发布:十大即时通讯软件 编辑:程序博客网 时间:2024/06/04 18:53
963. [NOI2012] 随机数生成器
★★ 输入文件:randoma.in 输出文件:randoma.out 简单对比时间限制:1 s 内存限制:128 MB
**【问题描述】
栋栋最近迷上了随机算法,而随机数是生成随机算法的基础。栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a,c,X[0],按照下面的公式生成出一系列随机数{Xn}:
X[n+1]=(aX[n]+c) mod m
其中mod m表示前面的数除以m的余数。从这个式子可以看出,这个序列的下一个数总是由上一个数生成的。
用这种方法生成的序列具有随机序列的性质,因此这种方法被广泛地使用,包括常用的C++和Pascal的产生随机数的库函数使用的也是这种方法。
栋栋知道这样产生的序列具有良好的随机性,不过心急的他仍然想尽快知道X[n]是多少。由于栋栋需要的随机数是0,1,…,g-1之间的,他需要将X[n]除以g取余得到他想要的数,即X[n] mod g,你只需要告诉栋栋他想要的数X[n] mod g是多少就可以了。
【输入格式】
输入文件randoma.in中包含6个用空格分割的整数m,a,c,X[0],n和g,其中a,c,X[0]是非负整数,m,n,g是正整数。
【输出格式】
输出到文件randoma.out中,输出一个数,即X[n] mod g
【样例输入】
11 8 7 1 5 3
【样例输出】
2
【样例说明】
计算得X[n]=X[5]=8,故(X[n] mod g) = (8 mod 3) = 2
【数据规模】
40%的数据中m为质数30%的数据中m与a-1互质50%的数据中n<=10^6100%的数据中n<=10^1840%的数据m,a,c,X[0]<=10^485%的数据m,a,c,X[0]<=10^9100%的数据中m,a,c,X[0]<=10^18100%的数据中g<=10^8对于所有数据,n>=1,m>=1,a>=0,c>=0,X[0]>=0,g>=1。
题解:
比较简单的矩阵乘,对于两个矩阵:
显然,X[n]可以由这两个矩阵相乘得到:
于是对于X[n],我们可以这样求:
比较坑人的是需要写快速乘,因为普通乘会炸。。。
(PS:快速乘几乎和快速幂写起来一样,只需要把 * 改成 +)
Code:
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>using namespace std;long long A[2][2]={{0,0},{0,1}},B[2][2]={{0,0},{1,0}},C[2][2]={0};long long n,g,m,nn;long long kc(long long x,long long y){ long long z=0; x%=m; y%=m; if (x<y) swap(x,y); while (y){ if (y&1) z=(z+x)%m; x=(2*x)%m; y>>=1; } return z;}int main(){ scanf("%lld%lld%lld%lld%lld%lld",&m,&A[0][0],&A[0][1],&B[0][0],&n,&g); nn=n; while (nn){ if (nn&1){ memset(C,0,sizeof(C)); for (int i=0; i<2; i++) for (int j=0; j<2; j++) for (int k=0; k<2; k++) C[i][j]=(C[i][j]+kc(A[i][k],B[k][j]))%m; for (int i=0; i<2; i++) for (int j=0; j<2; j++) B[i][j]=C[i][j]; } nn>>=1; memset(C,0,sizeof(C)); for (int i=0; i<2; i++) for (int j=0; j<2; j++) for (int k=0; k<2; k++) C[i][j]=(C[i][j]+kc(A[i][k],A[k][j]))%m; for (int i=0; i<2; i++) for (int j=0; j<2; j++) A[i][j]=C[i][j]; } printf("%lld\n",B[0][0]%g); return 0;}
1 0
- 【矩阵乘】【NOI 2012】【cogs963】随机数生成器
- [BZOJ 2875][NOI 2012]随机数生成器(矩阵快速幂)
- bzoj2875 [Noi2012]随机数生成器 [矩阵+快乘]
- [BZOJ2875][Noi2012]随机数生成器 && 矩阵+快速乘
- 2012 NOI 第一试 随机数生成器
- [BZOJ 2875 & Vijos 1725] NOI 2012 随机数生成器 · 矩阵乘法+快速乘法
- 2875: [Noi2012]随机数生成器 (矩阵乘法,快速幂,快速乘)
- [NOI2012]随机数生成器(矩阵乘法+快速乘)
- BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘
- 2875: [Noi2012]随机数生成器 矩阵乘法+快速乘
- BZOJ2875: [Noi2012]随机数生成器 矩阵乘法+快速乘
- BZOJ2875: [Noi2012]随机数生成器 矩阵乘法+快速乘
- [BZOJ 2875][Noi2012]随机数生成器:矩阵乘法+快速乘
- 随机数生成器 (NOI 2012 第一试 第一题)
- BZOJ 3671 NOI 2014 随机数生成器 贪心
- [NOI 2014] 随机数生成器:模拟,贪心
- UOJ#6 NOI-2014 随机数生成器
- 【NOI2012】随机数生成器【矩阵乘法】
- MyEclipse 配置SSH框架
- SVG基础——如何使用可缩放矢量图形(SVG)
- HDU 不容易系列之一
- 第十四周项目 小玩文件
- Android学习日记(1)
- 【矩阵乘】【NOI 2012】【cogs963】随机数生成器
- 中缀式转化为前缀式,中缀式转化为后缀式
- tp frameset刷新另外一个frameset
- commons-fileupload实现文件上传、下载、在线打开
- 命令行验证apk签名
- HDU Children’s Queue
- 在ScrollView中嵌套ListView的问题
- 《软件调试艺术》读后感一
- hdu 4419 矩形面积并