| 比赛 |
寒假集训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;
}