1 条题解

  • 0
    @ 2025-4-12 20:30:44

    题意分析

    解题思路

    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.acmr 分别对应输入的参数和当前生成的随机数。

    3.max 用于记录最大差值,t 用于记录上一个出现的随机数的值。

    4.在生成随机数的循环中,当生成的随机数已经出现过(即 b[r] 为 (1))时,停止循环。

    5.在遍历记录数组时,当遇到已出现的随机数时,计算其与上一个出现的随机数的差值,并更新最大差值。

    • 1

    信息

    ID
    1382
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    1
    上传者