【组合计数】CF1866 H

编程入门 行业动态 更新时间:2024-10-18 06:07:27

【<a href=https://www.elefans.com/category/jswz/34/1769978.html style=组合计数】CF1866 H"/>

【组合计数】CF1866 H

Problem - H - Codeforces

题意

思路

不知道这种trick叫什么,昨天VP刚遇到过

设 f[x] 为恰好有一个最大值为 x 的方案数,我们要求这个,那就设 g[x] 为 至少有一个最大值为 x 的方案数,那么答案就是 f[x] = g[x] - g[x - 1]

这里也一样,不过要稍微变一下

Code:

#include <bits/stdc++.h>#define int long longconstexpr int N = 1e6 + 10;
constexpr int mod = 998244353;
constexpr int Inf = 0x3f3f3f3f;int n, k;
int Fac[N];
int inv[N];
int g[N];int qpow(int a, int b) {int res = 1;while(b) {if (b & 1) res = (res * a) % mod;a = (a * a) % mod;b >>= 1;}return res;
}
void Fac_init() {Fac[0] = 1;for (int i = 1; i < N; i ++) {Fac[i] = (Fac[i - 1] * i) % mod;}inv[N - 1] = qpow(Fac[N - 1], mod - 2);for (int i = N - 2; i >= 0; i --) {inv[i] = (inv[i + 1] * (i + 1)) % mod;}
}
void solve() {std::cin >> n >> k;for (int i = std::max(0ll, n - k); i <= n; i ++) {g[i] = Fac[n - i + 1] * qpow(n - i + 1, k - (n - i)) % mod;}int ans = 0;for (int i = n; i >= std::max(0ll, n - k); i --) {int res = g[i] - g[i + 1];res *= Fac[n];res %= mod;res *= inv[i];res %= mod;ans += res;ans %= mod;}std::cout << ((ans % mod) + mod) % mod << "\n";
}
signed main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t = 1;Fac_init();while (t--) {solve();}return 0;
}

 

更多推荐

【组合计数】CF1866 H

本文发布于:2023-12-03 07:28:34,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1652666.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:组合

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!