这题之所以给你x是为什么?这其实还挺重要的,因为出题人想让你用隔板法,首先分类讨论,两种情况,第一种,第一段数字是左边的(定位0),那么就是把x个0分成(t+1)/2向上取整段,因为如果是奇数个段(等于t+1如果是奇数),那么一定是0结尾,接下来把n-x个1分成(t+1)/2向下取整,总共是两种情况, 如果是偶数个段,那左右都是(t+1)/2; 然后就是隔板法,在x中插入(t+1)/2个板子,(注意上下取整) 用组合数来解决。另外取模注意求逆元,快速幂预处理
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
using namespace std;
const int N = 1e6+5;
const int mod = 998244353;
int fact[N], infact[N];
int fac[N], ifac[N];
int qmi(int a, int b) {
int res = 1;
while (b > 0) {
if (b & 1) {
res = res * a % mod;
}
a = a * a % mod;
b >>= 1;
}
return res;
}
void init() {
fac[0] = ifac[0] = 1;
for (int i = 1; i < N; i++) {
fac[i] = fac[i - 1] * i % mod;
ifac[i] = ifac[i - 1] * qmi(i, mod - 2) % mod;
}
}
int C(int a, int b) {
return fac[a] * ifac[b] % mod * ifac[a - b] % mod;
}
int sv(int x, int k) {
if (k > x) return 0;
if (x == 0) return 1;
return C(x - 1, k - 1);
}
void solve() {
int n, x, t;
cin >> n >> x >> t;
int k1 = (t + 1) / 2, k2 = t + 1 - k1;
int ans1 = sv(x, k1) * sv(n - x, k2) % mod;//sv函数用于求解把x个球分成k堆的问题 sv(int x,int k)
int ans2 = sv(x, k2) * sv(n - x, k1) % mod;
int ans = (ans1 + ans2) % mod;
cout << ans << endl;
}
signed main() {
init();
int T = 1;
cin >> T;
while (T--)
solve();
return 0;
}

京公网安备 11010502036488号