计算给定的算法中能均匀出现多少个数字。
注意要处理有可能种子不在循环里面。
#include<cstdio>
#include<cstring>
const int MAXN=1e4+10;
bool used[MAXN];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int Z,I,M,L,c=1;
while(~scanf("%d%d%d%d",&Z,&I,&M,&L)){
if(!(Z||I||M||L)) break;
memset(used,false,sizeof(used));
used[L]=true;
int counter=0;
while(1){
L = (Z*L+I)%M;
if(!used[L]) used[L]=true; //先将出现的数标记
else{ //当标记过的数再次出现的时候,再进入计数,避免种子不是循环里面的
while(1){
if(used[L]) {used[L]=false;counter++;} //第二次进入再统计个数
else break;
L = (Z*L+I)%M;
}
break;
}
}
printf("Case %d: %d\n",c,counter);
c++;
}
return 0;
}