/*
* 解题思路:
* 题意不难理解,就是利用所给公式求出最多可产生不同的随机数个数
* 最开始的思路是像题目中例子那样,如果产生一个数跟第一个种子相同的话则跳出循环
* 写完代码后发现第三个Sample进入死循环,则发现最终的那个数有时候不是跟第一个种子相同,
* 而是跟任意一个已产生的种子数相同就判跳出循环
*/
#include <stdio.h> #include <string.h> int vis[ 10000 ]; int main( ) { int Z,I,M,L; int total = 1,sum,tmp; while( scanf("%d%d%d%d",&Z,&I,&M,&L) && ( Z||I||M||L ) ) { sum = 0; memset( vis,0,sizeof( vis ) ); while( 1 ) { tmp = (Z*L+I) % M; if( vis[ tmp ] != 0 ) break; sum++; vis[ tmp ]++; L = tmp; } printf("Case %d: %d\n",total++,sum); } return 0; }
原文:http://blog.csdn.net/u011886588/article/details/19485227