Description
Input
Output
Sample Input
3 5
Sample Output
1
1
2
4
8
Data Constraint
思路
设f[i][j]为有i个叶子结点,向左-向右的边=j的方案数
根据题意,我们要求f[i][0]
考虑如何拓展叶子结点(先向左再向右)
首先考虑向左,由于我们的顺序是先向左再向右,所以我们向左拓展时一定在叶子节点上,所以叶子结点不会增加。而且由于向右的不能超过m-1,所以当j<m-1时才能拓展
即f[i][j+1]+=f[i][j]
然后考虑向右,由于我们的顺序是先向左再向右,所以我们向左拓展时一定不在叶子节点上,所以叶子结点会增加。而且还是因为先向左再向右,所以j要>0 才能拓展
即f[i+1][j-1]+=f[i][j]
代码
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,N=5077;
int n,m,f[N][N];
int main()
{
freopen("ca.in","r",stdin); freopen("ca.out","w",stdout);
scanf("%d%d",&m,&n);
f[1][0]=1;
for(int i=1; i<=n; i++) for(int j=0; j<=m; j++)
{
if(j<m-1) f[i][j+1]=(f[i][j+1]+f[i][j])%mod;
if(j>0) f[i+1][j-1]=(f[i+1][j-1]+f[i][j])%mod;
}
for(int i=1; i<=n; i++) printf("%d\n",f[i][0]);
}