区间缩小
区间缩小
题目描述
给定一个正整数 ,我们初始设定两个变量 和 ,其中 ,。我们将执行以下步骤:
- 如果 ,则结束操作;否则,执行步骤 。
- 从区间 中等概率地选取一个正整数 。然后,以下两种情况互斥地发生:以概率 将 更新为 ,以概率 将 更新为 。接着返回步骤 。
经过上述操作,最终必然会有 。设随机变量 为最终得到的数字(即 ),求 的数学期望。 答案对 取模。
输入描述:
第一行给出两个正整数 ,其中 的具体意义如题意所示。令 。其中 的意义如题意所示。
输出描述:
输出一个整数,表示答案。
示例1
输入
234 10
输出
898419942
解题思路
期望题就没一道会做的。
最关键的性质,看不出来就别想做出来了。定义 表示在区间 内最终得到的数字的期望值,有 。
简单证明。定义 表示最终得到的数字为 的概率,那么有 。而 。又因为区间 与 的长度一样,依据题意长度相同的区间最终得到数字的相对位置的概率相同,即 ,因此有 。
所以对于每种长度的区间,我们只需求出 即可。用 dp 的思路求解该状态,即根据下一步左端点或右端点停留在哪个位置进行状态转移,有状态转移方程
只需累加前缀 就可以实现 转移(需要预处理逆元)。
AC 代码如下,时间复杂度为 :
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e6 + 5, mod = 998244353;
int f[N];
int qmi(int a, int k) {
int ret = 1;
while (k) {
if (k & 1) ret = 1ll * ret * a % mod;
a = 1ll * a * a % mod;
k >>= 1;
}
return ret;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
m = 1ll * m * qmi(100, mod - 2) % mod;
f[1] = 1;
for (int i = 2, s = 1; i <= n; i++) {
f[i] = (s + i * (i - 1ll) % mod * qmi(2, mod - 2) % mod * m) % mod * qmi(i - 1, mod - 2) % mod;
s = (s + f[i]) % mod;
}
cout << f[n];
return 0;
}
参考资料
集美大学第十一届校程序设计竞赛 验题人题解:https://zhuanlan.zhihu.com/p/1431495113
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/18488078
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2023-10-20 统计子矩阵
2023-10-20 [COCI2021-2022#6] Zemljište