您的位置:首页 > 其它

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有重复出现,那就会从那里开始循环。标记一下所产生的数字再第几个开始产生,一旦产生重复就可以计算其循环节多长。

#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代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: