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

代码一

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;
}
相关推荐
mit6.82418 分钟前
正反两次扫描|单调性cut
算法
Yzzz-F33 分钟前
牛客小白月赛127 E
算法
大锦终36 分钟前
递归回溯综合练习
c++·算法·深度优先
Keep__Fighting1 小时前
【神经网络的训练策略选取】
人工智能·深度学习·神经网络·算法
晚风吹长发1 小时前
初步了解Linux中的动静态库及其制作和使用
linux·运维·服务器·数据结构·c++·后端·算法
sin_hielo1 小时前
leetcode 3453(二分法)
算法
风之歌曲2 小时前
c++高精度模板
c++·算法·矩阵
嵌入式进阶行者2 小时前
【算法】深度优先搜索实例:华为OD机考双机位A卷- 中庸行者
c++·算法·华为od·深度优先
a3535413822 小时前
参数化曲线弧长公式推导
算法
不知名XL2 小时前
day27 贪心算法 part05
算法·贪心算法