xtuoj 随机数
题目
思路
这个地方按照题目给定的表达式进行操作即可,可以看到这个地方%m,所以产生的数只能在0~m-1之间,即最多有m个状态,周期最大为m,所以我们取前m个即可查看是否能产生0~m-1的数,我们可以采用一个标志数组,这个标志数组的下标就对应0~m-1这些数,先初始化为0,代表未产生,后面产生的x,我们可以就用x这个变量,也可以用x数组,然后最后判断的时候,可以遍历这个标志数组,如果有一个数未产生,直接输出No,直接结束判断,如果循环遍历完成,则说明m个数都产生了,输出Yes;还有一种思路,就是用cnt记录标志数组有多少个1,标志数组为1,则说明产生了这个数,如果cnt==m,则输出Yes,否则输出No
代码一
#include<stdio.h>
#include<stdbool.h>int main(){int a,c,m,x=0;while(scanf("%d%d%d",&a,&c,&m)!=EOF){int cnt=0;bool arr[10010]={false};arr[0]=true;for(int i=0;i<m;i++){x=(a*x+c)%m;arr[x]=true;}for(int i=0;i<m;i++){if(arr[i]==true) cnt++;}if(cnt==m) printf("Yes\n");else printf("No\n"); }return 0;
}
代码二
#include<stdio.h>
#define N 10010int a,c,m;
int x[N];int main(){while(~scanf("%d%d%d",&a,&c,&m)){x[0]=0;int y[N]={0};for(int i=0;i<m;i++){x[i+1]=(a*x[i]+c)%m;y[x[i]]=1;}int flag=0;for(int i=0;i<m;i++){if(y[i]==0){flag=1;printf("No\n");break;}}if(!flag) printf("Yes\n");}return 0;
}
代码三
#include<stdio.h>int a,c,m,x,flag;int main(){while(~scanf("%d%d%d",&a,&c,&m)){int y[10010]={0};x=0;for(int i=0;i<m;i++){x=(a*x+c)%m;y[x]=1;}int flag=0;for(int i=0;i<m;i++){if(y[i]==0){flag=1;printf("No\n");break;}}if(!flag) printf("Yes\n");}return 0;
}