#P17229. [2025年南开中学集训]猫与随机数
[2025年南开中学集训]猫与随机数
猫与随机数
题目描述
Lynette 有一个长度为 的序列 ,和长度为 的序列 。 次询问,给定区间 和正整数 ,设 在 中的部分为序列 ,其长度为 ,回答以下问题:
有一条长度为 的链,节点由 到 标号,定义一次从 ()开始的随机游走过程为:
- 设当前点为 。
- 若 ,则停止。
- 否则将费用加上 ,并且以相同的概率走到 或 。
回答以下问题(均对 取模):
- 从 开始随机游走,结束时 的概率。
- 从 开始随机游走,经过 的期望次数。
- 从 开始随机游走,期望费用。
- 从 的所有点开始随机游走,经过 的期望次数和。
- 从 的所有点开始随机游走,期望费用和。
注意:初始的点也要算次数和费用。
设以上五个问题的答案为 ,你需要回答 ,这个求和不用取模。
为了避免输入输出量过大,本题采用特殊的输入输出方式。
输入格式
复制以下代码(或者在下发文件 input.cpp 中复制):
namespace Input{
std::mt19937_64 R;
std::uniform_int_distribution<int> D, D1;
inline void init(int n, int m, int seed){
R = std::mt19937_64(seed);
D = std::uniform_int_distribution<int>(1, n);
D1 = std::uniform_int_distribution<int>(1, m);
}
inline int get(){
return D1(R);
}
inline void get(int &l,int &r, int &i, int &j){
l = D(R), r = D(R), i = D(R), j = D(R);
if(l > r) std::swap(l, r);
if(i < l) std::swap(l, i);
if(i > r) std::swap(i, r);
if(j < l) std::swap(l, j);
if(j > r) std::swap(j, r);
if(R() & 1) std::swap(i, j);
i -= l - 1;
j -= l - 1;
}
}
using Input::init;
using Input::get;
第一行 个整数 ,分别表示序列长度、 的上限、询问次数以及随机数种子。
第二行 个整数,分别表示 。
在读完上面数据之后,调用 init(n, m, seed)。
接下来调用 次 get() 函数,第 次调用的返回值是 。
接下来调用 次 get(l, r, i, j) 函数,获得一次询问的参数。
输出格式
设第 次的答案为 ,输出一行一个整数表示 ,这里不需要取模。
样例 1 输入
5 5 3 998244353
0 1 1 0 1
样例 1 输出
1283457144
样例 1 说明
序列为 ,三次询问及其对应的 分别为:
- 。
- 。
- 。
数据范围
对于所有数据,,,,,,,。
子任务
本题采用捆绑测试,并开启所有合理的子任务依赖。
| 子任务编号 | 保证为 的位置 | 分值 | |||
|---|---|---|---|---|---|
| 0 | 1 | ||||
| 1 | 无 | 9 | |||
| 2 | 10 | ||||
| 3 | 20 | ||||
| 4 | 5 | ||||
| 5 | 15 | ||||
| 6 | 5 | ||||
| 7 | |||||
| 8 | |||||
| 9 | |||||
| 10 | |||||
| 11 | 无 | 15 | |||