题目

思路
这个地方按照题目给定的表达式进行操作即可,可以看到这个地方%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
代码一
cpp
#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;
}
代码二
cpp
#include<stdio.h>
#define N 10010
int 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;
}
代码三
cpp
#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;
}