[NOI2014]随机数生成器 题解

原题网址:
bzoj P3671
洛谷 P2354
附原题:

时间限制 内存限制
1.00s ~ 5.00s 250.00MB
题目描述

小 H 最近在研究随机算法。随机算法往往需要通过调用随机数生成函数(例如 Pascal 中的 random 和 C/C++中的 rand)来获得随机性。事实上,随机数生成函数也并不是真正的“随机”,其一般都是利用某个算法计算得来的。
比如,下面这个二次多项式递推算法就是一个常用算法:
算法选定非负整数 x 0 , a , b , c , d x_0,a,b,c,d x0,a,b,c,d作为随机种子,并采用如下递推公式进行计算。
对于任意 i ≥ 1 i \geq 1 i1 $x_i==(a×x+b×x_{i-1}^2+c) mod d d d 这样可以得到一个任意长度的非负整数数列 x i , i ≥ 1 {x_i,i\geq1} xi,i1,一般来说,我们认为这个数列是随机的。
利用随机序列 x i , i ≥ 1 {xi},i\geq1 xi,i1,我们还可以采用如下算法来产生一个 1 1 1 K K K 的随机排列 T i , i = 1... k {T_i},i=1...k Ti,i=1...k
1、初始设 T T T 1 1 1 K K K的递增序列;
2、对 T T T进行 K K K次交换,第 i i i次交换,交换 T i T_i Ti T x i T_{x_i} Tximod i + 1 _{i+1} i+1
此外,小 H 在这 K K K次交换的基础上,又额外进行了 Q Q </

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值