UVA 350 Pseudo-Random Numbers 伪随机数(简单)
2015-06-28 23:40
399 查看
题意:给定Z, I, M, L,根据随机数产生式k=(Z*L+I)%M。但是L表示的是上一个产生的数,比如根据产生式产生了序列{2,5,4,3}那么5是由L=2算来的,4由L=5算来的..第1个所产生的数所需的L由系统给定。那么肯定会产生一个环,到某个位置就会开始产生重复的序列,比如12345345345...。求循环中有多少个数(循环节)?(如例是3,分别是345)
思路:因为z i m 都是不变的,当L一定,那么产生的数肯定是一定的,所以只要L有重复出现,那就会从那里开始循环。标记一下所产生的数字再第几个开始产生,一旦产生重复就可以计算其循环节多长。
AC代码
思路:因为z i m 都是不变的,当L一定,那么产生的数肯定是一定的,所以只要L有重复出现,那就会从那里开始循环。标记一下所产生的数字再第几个开始产生,一旦产生重复就可以计算其循环节多长。
#include <bits/stdc++.h> #define LL long long using namespace std; const int N=10005; bool ans ; int num ; int main() { //freopen("input.txt", "r", stdin); int z, i, m, l, j=0; while(~scanf("%d%d%d%d",&z,&i,&m,&l)) { if(!z && !i && !m && !l ) break;//结束 memset(ans,0,sizeof(ans)); memset(num,0,sizeof(num)); int cur=l, cnt=1; ans[cur]=true; num[cur]=1; while(1) { cur=(z*cur+i)%m; if(ans[cur])//已经出现过了 { printf("Case %d: %d\n",++j,cnt-num[cur]+1); break; } ans[cur]=1;//标记已经出现过 num[cur]=++cnt;//在第几步出现过 } } return 0; }
AC代码
相关文章推荐
- 字符串反转
- 直接拿来用!十大Material Design开源项目
- 莫一种可能的原因 gzip: stdin: not in gzip format
- javacore文件及heapdump文件分析
- Python数据类型之列表
- LeetCode Unique Paths
- 基于大数据分析的安全管理平台技术研究及应用
- 易宝典文章——玩转Office 365中的Exchange Online服务 之七 怎样新建Exchange Online用户,并实现邮件发送
- java中的内部类总结
- 文本查看操作
- 黑马程序员-OC语言-类的声明和实现(听课笔记)
- SHA安全散列算法
- 如何查看javacore和heapdump文件
- UVa 11917 - Do Your Own Homework
- Spring AOP 之 HelloWorld(简单例子)
- 信息与网络安全需要大数据安全分析
- 网卡配置
- .JavaCore/HeapDump文件及其分析方法
- 数论(一)
- ssh公钥私钥