题解:AT_arc102_c [ARC102E] Stop. Otherwise...
这是生成函数的另一种做法。
容易发现答案是对称的,所以我们只需要求解
我们考虑的对象是大小为
对于一个组,其选出
一种特殊情况是点数为
对于没有受到限制的骰子种类,其的选择方案数为:
对于同一个
之前的题解要把这个东西展开,但是实际上不用。我们可以发现
总复杂度
注意多项式除法可以以多项式乘法的逆过程实现。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2005,mod=998244353;
int n,k,f[N];
inline void c1(){// /(1-x)
for(int i=0;i<=n;i++) (f[i+1]-=f[i]*-1)%=mod;
}
inline void c2(){// *(1+x)
for(int i=n;i>=0;i--) (f[i+1]+=f[i]*1)%=mod;
}
inline void c3(){// *(1-x)
for(int i=n;i>=0;i--) (f[i+1]+=f[i]*-1)%=mod;
}
inline int calc(int T){
return ((f[n]+(T%2?f[n-1]:0))%mod+mod)%mod;
}
int ans[N*2];
signed main(){
cin.tie(0)->sync_with_stdio(0);
cin>>k>>n;
f[0]=1;
for(int i=1;i<=k;i++) c1();
int T=0;
for(int s=1;s<=k+1;s++){
int NT=min(s-1,k);
if(NT>T){
if(NT/2!=T/2) c2();
else c3();
}
T=NT;
if(s!=1) ans[s-1]=calc(T);
}
for(int i=1;i<=k;i++) ans[k+i]=ans[k-i];
for(int i=1;i<=k*2-1;i++) cout<<ans[i]<<"\n";
return 0;
}