L=(Z*L + I)%M,求L的循环周期。
注意L不一定是在初始位置开始循环。
哈希 数组标记出现过的L,判断即可。
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 using namespace std; 6 7 int main() 8 { 9 long long a[10001], l, z, i, m, cnt, cas=1; 10 while(cin >> z >> i >> m >> l, z||i||m||l) 11 { 12 memset(a, 0, sizeof(a)); 13 cnt=0; 14 while(1) 15 { 16 l=(z*l+i)%m; 17 if (a[l]) 18 break; 19 a[l]=1; 20 cnt++; 21 } 22 printf("Case %lld: %lld\n", cas++, cnt); 23 } 24 return 0; 25 }