1 条题解
-
0
题意分析
解题思路
1.首先,根据给定的参数和公式生成随机数序列,使用一个数组记录每个随机数是否出现过。
2.当生成的随机数出现重复时,停止生成序列。
3.遍历记录数组,找出相邻出现的随机数之间的最大差值。
分析
1.由于随机数的范围是 (0) 到 (m - 1),可以使用一个长度为 (m) 的数组来记录每个随机数是否出现过。
2.当再次生成已经出现过的随机数时,说明序列开始循环,此时停止生成。
3.通过遍历记录数组,计算相邻出现的随机数之间的差值,找到最大差值。
实现步骤
1.读取输入的 (a)、(c)、(m) 和 (R_0),并对 (a) 和 (c) 取模 (m)。
2.初始化记录数组 (b),将 (R_0) 对应的位置标记为已出现。
3.按照公式 Rn = (aRn - 1 + c) mod m 不断生成随机数,直到生成的随机数已经出现过。
4.遍历记录数组 (b),计算相邻出现的随机数之间的差值,更新最大差值。
5.输出最大差值。
代码实现
#include<stdio.h> #define N 16000005 int b[N]={0}; int main() { long a,c,m,r,i,j,max=0,t; scanf("%ld%ld%ld%ld",&a,&c,&m,&r); a%=m; c%=m; b[r]=1; while(1) { r=(r%m*a%m+c)%m; if(b[r])break; b[r]=1; } t=m; for(i=0;i<m;i++) { if(b[i]) { if(max<i-t)max=i-t; t=i; } } printf("%ld\n",max); return 0; }
代码说明
1.
b
数组用于记录每个随机数是否出现过,数组下标表示随机数的值,数组元素为 (1) 表示该随机数已出现,为 (0) 表示未出现。2.
a
、c
、m
和r
分别对应输入的参数和当前生成的随机数。3.
max
用于记录最大差值,t
用于记录上一个出现的随机数的值。4.在生成随机数的循环中,当生成的随机数已经出现过(即
b[r]
为 (1))时,停止循环。5.在遍历记录数组时,当遇到已出现的随机数时,计算其与上一个出现的随机数的差值,并更新最大差值。
- 1
信息
- ID
- 1382
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 1
- 上传者