【NOI2012】随机数生成器
来源:互联网 发布:c语言控制鼠标点击 编辑:程序博客网 时间:2024/05/01 20:01
Description
栋栋最近迷上了随机算法,而随机数生成是随机算法的基础。栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数 m, a, c, X0,按照下面的公式生成出一系列随机数:
Xn+1=(aXn+c) mod m
其中 mod m 表示前面的数除以m的余数。从这个式子可以看出,这个序列的下一个数总是由上一个数生成的。
用这种方法生成的序列具有随机序列的性质,因此这种方法被广泛地使用,包括常用的 C++和 Pascal 的产生随机数的库函数使用的也是这种方法。
栋栋知道这样产生的序列具有良好的随机性,不过心急的他仍然想尽快知道Xn是多少。由于栋栋需要的随机数是0, 1, … ,n−1 之间的,他需要将 Xn 除以g取余得到他想要的数,即 Xn mod g,你只需要告诉栋栋他想要的数Xn mod g是多少就可以了。
Input
输入中包含 6 个用空格分割的整数m, a, c, X0, n和g,其中a, c, X0是非负整数,m, n, g是正整数。
Output
输出一个数,即Xn mod g
Sample Input
11 8 7 1 5 3
Sample Output
2
Solution
用输入中的变量
矩阵大小为2*2,由[x0 c]转移到[x1 c]以此类推
矩阵为
将(1)n次方后与(2)相乘就会得到[xn c]
Code
#include<cstdio>#include<cstring>#include<algorithm>#define ll long long#define fo(i,a,b) for(ll i=a;i<=b;i++)using namespace std;ll mo,x,n,g,a[2][2],b[2][2],c[2][2],y;ll cheng(ll x,ll y){ if(y==0) return 0; if(y==1) return x; ll z=cheng(x,y/2); z=(z+z)%mo; if(y%2==0) return z; else return (z+x)%mo;}void fz(){ fo(i,0,1) fo(j,0,1) c[i][j]=a[i][j],a[i][j]=0;}void ch1(){ fz(); fo(i,0,1) fo(j,0,1) fo(k,0,1) (a[i][k]+=cheng(c[i][j],c[j][k]))%=mo;}void ch2(){ fz(); fo(i,0,1) fo(j,0,1) fo(k,0,1) (a[i][k]+=cheng(b[i][j],c[j][k]))%=mo;}void dg(ll n){ if(n==1) return; dg(n/2); ch1(); if(n%2==1) ch2();}int main(){ freopen("random.in","r",stdin); freopen("random.out","w",stdout); scanf("%lld%lld%lld%lld%lld%lld",&mo,&a[0][0],&y,&x,&n,&g); a[0][1]=0;a[1][1]=a[1][0]=1; fo(i,0,1) fo(j,0,1) b[i][j]=a[i][j]; dg(n); b[0][0]=x;b[0][1]=y;b[1][0]=b[1][1]=0; ch2(); printf("%lld",a[0][0]%g);}
1 0
- 【NOI2012】随机数生成器
- [bzoj2875][Noi2012]随机数生成器
- [BZOJ2875][Noi2012]随机数生成器
- 【NOI2012】【BZOJ2875】随机数生成器
- 【NOI2012】随机数生成器
- 【NOI2012】随机数生成器
- 2875: [Noi2012]随机数生成器
- BZOJ2875 [Noi2012]随机数生成器
- 【NOI2012】随机数生成器
- 【NOI2012】随机数生成器
- [NOI2012]随机数生成器
- bzoj2875 [Noi2012]随机数生成器
- JZOJsenior3366.【NOI2012】随机数生成器
- BZOJ 2875 [NOI2012] 随机数生成器
- 【NOI2012】随机数生成器【矩阵乘法】
- {题解}[jzoj3366]【NOI2012】随机数生成器
- JZOJ 3366. 【NOI2012】随机数生成器
- BZOJ 2875: [Noi2012]随机数生成器
- 后面抽空看一下
- ExternalStorage存放音乐,通过Notification播放音乐,并震动的Demo
- apue:进程关系
- 泛型的参数的传递示意图
- 深入分析js中的constructor 和prototype
- 【NOI2012】随机数生成器
- CJOJ P2317 JesseLiu的预算方案
- 为什么1000 == 1000返回为False,而100 == 100会返回为True?
- 【JZOJ 3693】 慎二的随机数列
- 用51单片机+11.0592的晶振,如何产生115200的波特率
- Android平台美颜相机/Camera实时滤镜/视频编解码/影像后期/人脸技术探索——2.2 来一份LOMO滤镜
- 初出茅庐
- 折纸问题
- 程序功能:建立一个带有头结点的单向链表,并将存储在数组中的字符依次转储到链表的各个结点中。