题解:AT_agc040_f [AGC040F] Two Pieces
Tiat_Siba_Ignareo · · 题解
组合意义神仙题……
看其他题解没看懂讲的是什么意思,所以自己写一篇 qwq。
前置知识:隔板法
有
答案是
有
答案是
本题做法
因为两个棋相同,所以不放设两个棋为
考虑在移动
首先插入令
然后考虑插入令
乘起来即可。但是有一个细节:若
最后是
然后做就行了。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
int n, a, b, fac[10000005], inv[10000005], ans;
int qpow(int x, int k){
int ans = 1;
while (k){
if (k & 1)
ans = ans * x % mod;
x = x * x % mod;
k >>= 1;
}
return ans;
}
int qmod(int a, int b){
return a * qpow(b, mod - 2) % mod;
}
int C(int n, int m){
return fac[n] * inv[n - m] % mod * inv[m] % mod;
}
int nmod(int x){
return (x % mod + mod) % mod;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> a >> b;
if (!a && !b){
cout << 1;
return 0;
}
fac[0] = 1;
for (int i = 1; i <= n; i++)
fac[i] = fac[i - 1] * i % mod;
for (int i = 0; i <= n; i++)
inv[i] = qmod(1, fac[i]);
for (int i = 0; i <= min(min(a, b - 1), n - b); i++){
if (n - b - i == 0){
if (i == a)
ans = (ans + nmod(C(b + i - 1, i) - C(b + i - 1, i - 1))) % mod;
}else{
int qwq = (nmod(C(b + i - 1, i) - C(b + i - 1, i - 1))) % mod;
ans = (ans + (qwq * C(n + a - b - 2 * i - 1, a - i) % mod)) % mod;
}
}
cout << ans;
return 0;
}