Poj 1597
– Uniform Generator
题目的意思就是一个生成随机数的函数,
Seed[x+1] = ( seed[x] + STEP ) % MOD
其中seed就是我们生成出来的随机数,至于seed[0]是哪个数并不重要,后面会证明。STEP就是我们每次往前一个所加的值,再module上MOD得到下一个随机数。
判断这个随机生成函数的好坏的依据是如果能够产生0~MOD-1内的所有数,就是一个好的,否则坏。
我们知道了同余的特性,便可以假设在k步之后,生成的seed[k] = seed[0],所以由此有
Seed[k] = ( seed[0] + STEP*k ) % MOD
那么,
STEP * k = MOD
而我们如果要生产MOD个数,必须使k≥MOD,而且k不可能大于MOD,因为这个条件下生成的数又开始重复,所以k=MOD;在前面的条件下,如果STEP和MOD有大于1的公约数例如d,那么会有STEP*(k/d)
= MOD,这就是一个循环了,只会产生k/d<MOD个随机数。
结论:iff gcd(STEP, MOD) == 1, good choice.