题目大意:输入Z, I, M, L,根据题目给的伪随机数公式,先输入的L作为第一次的随机数, (Z × L + I) % M 作为下一次的随机数L,求伪随机数的周期,即碰到重复的随机数。

解题思路:直接循环内计算,第一个随机数L不一定在伪随机数的周期内。所以一个标记数组,既是记录是否出现过,也是记录出现在第几次。

ac代码:


#include <iostream>
#include <cstring>
using namespace std;
int Z, I, M, L, sum, cnt=1, count, used[10005];
int main()
{
while (scanf("%d%d%d%d", &Z, &I, &M, &L)!=EOF){
if (!Z && !I && !M && !L)
break;
count = 0;
memset(used, 0, sizeof(used));
while (!used[L]){
used[L] = count + 1;
sum = (Z * L + I);
L = sum % M;
count++;
}
printf("Case %d: %d\n", cnt++, count-used[L]+1);
}
return 0;
}