分析:题意是一个生成随机数的函数,Seed[x+1] = ( seed[x] + STEP ) % MOD,seed是生成出来的随机数,seed[0]是哪个数并不重要,后面证明。STEP就是每次往前一个所加的值,再模上MOD得到下一个随机数。
判断这个随机生成函数的好坏的依据是如果能够产生0~MOD-1内的所有数,就是一个好的,否则坏(因此该題也可以用模拟,用HASH表)。
根据同余特性,便可以假设在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个随机数。也就是两个数要互质。
结论:if gcd(STEP, MOD) == 1, good choice.
#include<iostream> using namespace std; int gcd(int x,int y) { return y==0?x:gcd(y,x%y); } int main() { int s,m; while(cin>>s>>m) { printf("%10d%10d ",s,m); if(gcd(s,m)==1) cout<<"Good Choice\n"<<endl; else cout<<"Bad Choice\n"<<endl; } return 0; }
时间: 2024-10-09 07:07:21