[数学记录]AT4362 [ARC102C] Stop. Otherwise...
command_block · · 个人记录
题意 :有
现在对于
骰子之间本质相同(无标号)。
答案对
对于一个对子 :
对于一个没有配对的数 :
将所有生成函数乘起来,答案为 :
考虑如何快速求
分子分母的展开式都是容易表示的,暴力计算卷积即可。
复杂度
#include<algorithm>
#include<cstdio>
#define ll long long
#define MaxN 2050
using namespace std;
const int mod=998244353;
ll powM(ll a,int t=mod-2){
ll ret=1;
while(t){
if (t&1)ret=ret*a%mod;
a=a*a%mod;t>>=1;
}return ret;
}
int fac[MaxN<<1],ifac[MaxN<<1];
int C(int n,int m){
if (m>n)return 0;
return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}
void Init(int n)
{
fac[0]=1;
for (int i=1;i<=n;i++)
fac[i]=1ll*fac[i-1]*i%mod;
ifac[n]=powM(fac[n]);
for (int i=n;i;i--)
ifac[i-1]=1ll*ifac[i]*i%mod;
}
int calc(int a,int b,int n)
{
int ret=0;
for (int i=0;i<=n;i++)
ret=(ret+1ll*C(a,i)*C(b+(n-i)-1,n-i))%mod;
return ret;
}
int n,k,ans[MaxN];
int main()
{
scanf("%d%d",&k,&n);
Init(n+k);
for (int i=2;i<=k+1;i+=2){
ans[i]=calc(i/2,k-i+1+(i-1)/2,n);
ans[i+1]=ans[i];
}
for (int i=2;i<=k+1;i++)printf("%d\n",ans[i]);
for (int i=k;i>=2;i--)printf("%d\n",ans[i]);
return 0;
}