abc275_e Sugoroku 4 题解
Sugoroku 4
题意
有一行格子,编号为
你手上有一个转盘,转盘上写有数字
假设某次转转盘后转盘显示的数值为
当你在某次走完后恰好停在第
数据范围
。 。
思路
一个明显的概率 dp。
提到等概率和取模,不难想到费马小定理,转盘上显示某个数的概率为
定义
- 状态:
表示转了 次转盘走到编号为 的格子的概率。 - 转移:
,你也可以思考一下扩散性转移。 - 初始状态:
。 - 目标状态:
。
注意取模和乘法爆 int 的细节即可。
复杂度
- 时间:
。 - 空间:
。
Code
点击查看代码
#include <bits/stdc++.h> using namespace std; using ll = long long; const int mod = 998244353, N = 1e3 + 10; int n, m, k; ll qp, dp[N][N], ans; ll qmod (ll a, int b) { // 快速幂求 qp ll ans = 1; while (b) { if (b & 1) { ans = (ans * a) % mod; } a = (a * a) % mod, b >>= 1; } return ans; } int Q (int x, int t) { // 求按规则从 x 往后走 t 步会走到的格子的编号 if (x + t <= n) { // 不用回头 return x + t; } return 2 * n - t - x; // 回头 } int main () { ios::sync_with_stdio(0), cin.tie(0); cin >> n >> m >> k; qp = qmod(m, mod - 2), dp[0][0] = 1; for (int i = 0; i < k; i++) { // 扩散形转移好写 for (int j = 0; j < n; j++) { for (int l = 1; l <= m; l++) { // 枚举走多少步 dp[i + 1][Q(j, l)] = (dp[i + 1][Q(j, l)] + dp[i][j] * qp) % mod; // 取模! } } } for (int i = 1; i <= k; i++) { ans = (ans + dp[i][n]) % mod; } cout << ans; return 0; }
本文作者:wnsyou の blog
本文链接:https://www.cnblogs.com/wnsyou-blog/p/17446532.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步