URL:https://atcoder.jp/contests/abc300
目录
给一个 N,然后投色子,筛到每个数(即 1 - 6)的概率均等,把所筛到的数一个个相乘,直到 T = N 的概率是多少。
来自:https://blog.csdn.net/weixin_66946161/article/details/130464789
dp[x] 表示,从 x 到 N 的概率是多少。
- #include "bits/stdc++.h"
- #define int long long
-
- const int mod = 998244353;
-
- int ksm(int a, int b) {
- int res = 1;
- while (b > 0) {
- if (b & 1) res = res * a % mod;
- a = a * a % mod;
- b = b / 2;
- }
- return res;
- }
-
- int inv(int x, int p) {
- return ksm(x, p - 2);
- }
-
- int n, inv5;
- std::map <int, int> dp;
-
- int dfs(int x) { // dp[x]: x 到 n 的概率
- if (x > n) return 0; // 大于 n 的情况不存在
- else if (x == n) return 1; // n 到 n 的概率为 1
- else if (dp.count(x)) return dp[x];
-
- int res = 0;
- for (int i = 2; i <= 6; ++ i) res += dfs(i * x);
-
- res = res * inv5 % mod;
- dp[x] = res;
-
- return dp[x];
- }
-
- signed main() {
- std::cin >> n;
-
- inv5 = inv(5, mod);
-
- std::cout << dfs(1);
- }