模拟运算的过程就行了,注意不要用数组来保存运算结果,其实运算过程只需要一个数字最后出现的位置就行了,用map来存储正好合适。
#include <stdio.h>
#include <map>
using namespace std;
typedef int NUM;
typedef int LAST_POS;
map<NUM, LAST_POS> m;
int case_count;
void func(int Z, int I, int M, int L)
{
int count;
m.clear();
count = 1;
m[L] = 1;
while(1)
{
L = (Z*L+I)%M;
count ++;
if(m.find(L) == m.end())
{
m[L] = count;
}
else
{
break;
}
}
printf("Case %d: %d\n", case_count, count - m.find(L)->second);
}
int main(void)
{
int Z, I, M, L;
case_count = 0;
while(1)
{
scanf("%d %d %d %d", &Z, &I, &M, &L);
if(!Z && !I && !M && !L)
break;
case_count ++;
func(Z, I, M, L);
}
return 0;
}