比赛 寒假集训5 评测结果 AAAAAAAAAA
题目名称 挚爱时光 最终得分 100
用户昵称 终焉折枝 运行时间 2.059 s
代码语言 C++ 内存使用 156.31 MiB
提交时间 2026-03-01 09:20:26
显示代码纯文本
#include<iostream>
using namespace std;

#define int long long
const int MOD = 998244353;
const int MXN = 5000005;

int fac[MXN], inv[MXN], pow2[MXN], g[MXN];

int pw(int x, int y){
	int res = 1;
	x %= MOD;
	while(y){
		if(y & 1) res = (res * x) % MOD;
		x = (x * x) % MOD;
		y >>= 1;
	}
	return res;
}

void init(){
	fac[0] = pow2[0] = 1;
	for(int i = 1;i < MXN;i ++){
		fac[i] = (fac[i - 1] * i) % MOD;
		pow2[i] = (pow2[i - 1] * 2) % MOD;
	}
	inv[MXN - 1] = pw(fac[MXN - 1], MOD - 2);
	for(int i = MXN - 2;i >= 0;i --) inv[i] = (inv[i + 1] * (i + 1)) % MOD;
	g[0] = 1;
	g[1] = 0;
	for(int i = 2;i < MXN;i ++){
		int A = (4 * i % MOD * (i - 1)) % MOD;
		int B = (g[i - 1] + (2 * i - 2) * g[i - 2]) % MOD;
		g[i] = (A * B) % MOD;
	}
}

int C(int n, int k){
	if(k < 0 || k > n) return 0;
	return fac[n] * inv[k] % MOD * inv[n - k] % MOD;
}

int f(int n, int k){
	int res = (C(n, k) * C(n, k)) % MOD;
	res = (res * fac[k]) % MOD;
	res = (res * pow2[k]) % MOD;
	res = (res * g[n - k]) % MOD;
	return res;
}

signed main(){
	freopen("love.in", "r", stdin);
	freopen("love.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	init();

	int T, n, k;
	cin >> T;
	while(T --){
		cin >> n >> k;
		cout << f(n, k) << '\n';
	}

	return 0;
}