【2023——二项式反演】
题目
分析
采用至少->恰好
勘误:n-3k是位置,包括自由位数和潜在的4位段的位置
代码
#include <iostream>
using namespace std;
using ll = long long;
const int N = 1e5+10;
const int mod = 998244353;
int fac[N], infac[N];
int qmi(int base, int expo)
{
int retv = 1;
while(expo)
{
if(expo & 1) retv = 1ll * retv * base % mod;
base = 1ll * base * base % mod;
expo >>= 1;
}
return retv;
}
void init(int n)
{
fac[0] = 1, infac[0] = 1;
for(int i = 1; i <= n; i++)
fac[i] = 1ll * fac[i - 1] * i % mod;
infac[n] = qmi(fac[n], mod-2);
for(int i = n-1; i; i--)
infac[i] = 1ll * infac[i+1] * (i+1) % mod; //注意这里是 *(i+1)
}
int C(int a, int b)
{
return 1ll * fac[a] * infac[b] % mod * infac[a-b] % mod;
}
int main()
{
init(1e5);
int n, m;
cin >> n >> m;
ll ans = 0;
for(int i = m; i <= n/4; i++)
{
ll seg = 1ll * C(i, m) * C(n-3*i, i) % mod * qmi(10, n-4*i) % mod;
if(i-m&1) seg = -seg;
ans = (ans + seg + mod) % mod; //存在-seg,要防负
}
cout << ans;
return 0;
}