KDOI R2 B 题解
dAniel_lele · · 题解
前几个 Subtask 部分可以使用暴力、动态规划与矩阵快速幂优化动态规划解决,在此不一一阐述。
对于这道题,我们会发现一个特性,就是最多只能使用
阅读提示,以下定义
先考虑一个简单版本的问题,请问使用
考虑我们给上面一半放置
解决了这个小问题,我们可以来谈谈大体的思路。直接计算这个问题不好算,我们考虑先用
那么,现在我们的问题转换成了用
首先,我们会考虑将使用的
其次,我们假设每段分出来的距离是
最后,我们还要考虑把剩下来的
很明显,这个式子可以表示成从
然后你把搞的式子交上去,你会获得
所以最终公式为:
#include <bits/stdc++.h>
using namespace std;
int mod=998244353;
int qp(int a,int b){
int ans=1;
while(b){
if(b&1) ans=((long long)ans*a)%mod;
a=((long long)a*a)%mod;
b>>=1;
}
return ans;
}
int fac[40000005],inv[40000005];
void init(){
fac[0]=1;
for(int i=1;i<=40000000;i++){
fac[i]=((long long)fac[i-1]*i)%mod;
}
inv[40000000]=qp(fac[40000000],mod-2);
for(int i=39999999;i>=0;i--){
inv[i]=((long long)inv[i+1]*(i+1))%mod;
}
}
long long C(int i,int j){
return (long long)((long long)inv[j]*inv[i-j]%mod)*fac[i]%mod;
}
signed main(){
init();
int n,k;
cin>>n>>k;
int ans=0;
for(int i=1;i<=k;i++){
for(int j=0;j<=k&&k-j-2*i>=0;j++){
if(2*(n-i-j)<0||k-j-2*i<0||n-j-1<0||2*(n-i-j)<k-j-2*i||j+1<i||n-j-1<i-1) continue;
ans=(ans+((long long)(C(2*(n-i-j),k-j-2*i)*C(j+1,i)%mod)*(long long)C(n-j-1,i-1)%mod))%mod;
}
}
cout<<(ans+(n==k))%mod;
}