
#include <cstdio> |
using namespace std; |
const int maxn = 65535; |
struct hash_tag |
{ |
int key, num, next; |
}hash[maxn<<1]; |
int flag[maxn], idx, top; |
void insert(int n, int num) |
{ |
int k = (n&65535); |
if (flag[k]!=idx) |
{ |
flag[k] = idx; |
hash[k].key = n; |
hash[k].num = num; |
hash[k].next = -1; |
return; |
} |
while (hash[k].next != -1) |
{ |
if (hash[k].key == n) return; |
k = hash[k].next; |
} |
hash[k].next = ++top; |
hash[top].key = n; |
hash[top].num = num; |
hash[top].next = -1; |
} |
int find(int n) |
{ |
int k = (n&65535); |
if (flag[k]!=idx) |
{ |
return -1; |
} |
while (k!=-1) |
{ |
if (hash[k].key == n) return hash[k].num; |
k = hash[k].next; |
} |
return -1; |
} |
//map, set, hash_set, hash_map |
int main() |
{ |
int Z = 0, I = 0, M = 0, L = 0; |
int t = 0; |
while (scanf("%d%d%d%d", &Z, &I, &M, &L)==4) |
{ |
if (Z == 0&&I == 0&&M== 0&&L == 0) break; |
int count = 0, temp; |
top = maxn;idx++; |
t++; |
L = (Z*L+I)%M; |
while ((temp=find(L)) == -1) |
{ |
insert(L, ++count); |
L = (Z*L+I)%M; |
} |
printf("Case %d: %d\n", t, count-temp+1); |
} |
return 0; |
} |




by: 发表于:2017-08-11 10:10:12 顶(0) | 踩(0) 回复
??
回复评论