1.转化为l=1,最后乘上l
2.对于一个方案,就是随便选择一个点,选在合法区间内的概率
3.对于本质相同的所有方案考虑在一起,贡献就是合法区间个数/(2*n+1)
4.运用条件概率或者直接解释,只需求出所有本质不同的方案的合法区间个数的和
5.DP即可。
#include<bits/stdc++.h> #define reg register int #define il inline #define fi first #define se second #define mk(a,b) make_pair(a,b) #define numb (ch^'0') using namespace std; typedef long long ll; template<class T>il void rd(T &x){ char ch;x=0;bool fl=false; while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x); } template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');} template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');} template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{ const int N=4008; const int mod=998244353; int n,k,l; int qm(int x,int y){ int ret=1; while(y){ if(y&1) ret=(ll)ret*x%mod; x=(ll)x*x%mod; y>>=1; } return ret; } int ad(int x,int y){ return x+y>=mod?x+y-mod:x+y; } int f[N][N][2]; int main(){ rd(n);rd(k);rd(l); f[0][0][0]=1; for(reg i=1;i<=2*n+1;++i){ for(reg j=0;j<=i;++j){ for(reg x=0;x<=1;++x){ if(i+j+(1-x)<=2*n+1){ // cout<<i<<" "<<j<<" "<<x<<endl; f[i][j][x]=ad(f[i][j][x],(ll)f[i-1][j+1][x]*(j+1)%mod); if(j>0)f[i][j][x]=ad(f[i][j][x],f[i-1][j-1][x]); if(x==1&&j>=k)f[i][j][x]=ad(f[i][j][x],f[i-1][j][0]); // cout<<" val "<<f[i][j][x]<<endl; } } } } // cout<<f[2*n+1][0][1]<<endl; ll jie=1; for(reg i=n+1;i<=2*n+1;++i) jie=(ll)jie*i%mod; ll ans=(ll)f[2*n+1][0][1]*qm(2,n)%mod*qm(jie,mod-2)%mod; cout<<(ll)ans*l%mod; return 0; } } signed main(){ Miracle::main(); return 0; } /* Author: *Miracle* Date: 2019/4/13 19:58:12 */