【组合计数】CF1866 H

Problem - H - Codeforces

题意

思路

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

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

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

Code:

cpp 复制代码
#include <bits/stdc++.h>

#define int long long

constexpr 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;
}
相关推荐
电院工程师2 小时前
轻量级密码算法CHAM的python实现
python·嵌入式硬件·算法·安全·密码学
@老蝴8 小时前
C语言 — 通讯录模拟实现
c语言·开发语言·算法
L-ololois9 小时前
【AI】模型vs算法(以自动驾驶为例)
人工智能·算法·自动驾驶
安全系统学习10 小时前
网络安全之RCE简单分析
开发语言·python·算法·安全·web安全
GEEK零零七12 小时前
Leetcode 3299. 连续子序列的和
算法·leetcode·动态规划
飞飞是甜咖啡12 小时前
【机器学习】Teacher-Student框架
人工智能·算法·机器学习
蒟蒻小袁12 小时前
力扣面试150题--单词接龙
算法·leetcode·面试
ghie909012 小时前
LMD分解通过局部均值分解重构信号实现对信号的降噪
算法·均值算法·重构
零叹13 小时前
篇章十 数据结构——排序
java·数据结构·算法·排序算法
涛哥码咖13 小时前
前端十种排序算法解析
前端·算法·排序算法