abc 275 e 题解
abc 275 e
题意
有一个棋盘,上面有 \(N + 1\) 个格子,分别编号为 \(0, 1, \dots, N\)。Takahashi 一开始在 \(0\),他想要去 \(N\)。
Takahashi 有一个转盘,上面有 \(1\) 到 \(M\) 的 \(M\) 个数字,每次转动轮盘这些数字都会等概率的出现。每次转动轮盘,Takahashi 都会走相对应的步数,如果会超出 \(N\),那么他会掉头往回走。
当 Takahashi 到达 \(N\) 时,游戏结束,并且 Takahashi 获胜。请问在 Takahashi 至多转 \(K\) 次轮盘的前提下获胜的概率,答案对 \(998244353\) 取模。
思路
首先,我们得先看这个东西:费马小定理。因为每次转动轮盘都会让概率乘上 \(\frac{1}{m}\),答案又需要对 \(998244353\) 取模,所以需要用到费马小定理。
可以想到,状态是 \(dp_{i, j}\) 表示当前是第 \(i\) 次转轮盘,Takahashi 走到了 \(j\)。
所以就有转移:
\(dp_{i, j} \rightarrow dp_{i + 1, F(j, k)} \ (1 \le k \le M)\),\(F(j, k)\) 表示从 \(j\) 走出去 \(k\) 步所走到的地方。
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int mod = 998244353, N = 1010, K = 1010;
int n, m, k;
ll inv, dp[K][N], ans;
ll P(int a, int b) {
if (b == 1) {
return a;
}
ll tmp = P(a, b / 2);
return tmp * tmp % mod * (b % 2 ? a : 1) % mod;
}
int C(int i, int j) {
return i + j > n ? 2 * n - i - j : i + j;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m >> k;
inv = P(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][C(j, l)] = (dp[i + 1][C(j, l)] + dp[i][j] * inv % mod) % mod;
}
}
}
for (int i = 1; i <= k; i++) {
ans = (ans + dp[i][n]) % mod;
}
cout << ans;
return 0;
}