Loading

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;
}
posted @ 2023-06-02 16:39  chengning0909  阅读(6)  评论(0编辑  收藏  举报