注意不一定從種子開始,
也就意味第一個數可能是非cycle數。
/* ACM 350 Pseudo-Random Numbers * mythnc * 2011/11/17 21:48:38 * run time: 1.1 */ #include <stdio.h> #define MAXR 10000 int len(int, int, int, int); int in(int, int *, int); int main(void) { int z, inc, mod, last, set; set = 0; while (scanf("%d %d %d %d", &z, &inc, &mod, &last) && mod != 0) printf("Case %d: %d\n", ++set, len(z % mod, inc % mod, mod, last)); return 0; } /* len: return the len */ int len(int z, int inc, int mod, int last) { int i, tmp, seed; int r[MAXR]; r[0] = last; for (i = 1; ; i++) { tmp = (r[i - 1] * z + inc) % mod; if ((seed = in(tmp, r, i)) != -1) return i - seed; r[i] = tmp; } } /* in: if n in r, * i = 0 mean start from seed return TRUE, * i > 0 mean start not from seed return i, * else return -1 */ int in(int n, int *r, int count) { int i; for (i = 0; i < count; i++) if (r[i] == n) return i; return -1; }
沒有留言:
張貼留言