给你斯特林数就换成通项公式,给你k次方就换成斯特林数
考虑换成通项公式之后,组合数没有什么好的处理方法
直接拆开,消一消阶乘
然后就发现了(j-k)和k!
往NTT方向靠拢
然后大功告成
其实只要想到把斯特林公式换成通项公式,考虑用NTT优化掉(j-k)^i
后面都是套路了。
#include#define reg register int#define il inline#define numb (ch^'0')#define int long longusing namespace std;typedef long long ll;il void rd(int &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);}namespace Miracle{const int N=100000+5;const int mod=998244353;const int G=3;const int GI=332748118;ll qm(ll x,ll y){ ll ret=1; while(y){ if(y&1) ret=ret*x%mod; x=x*x%mod; y>>=1; }return ret;}int rev[4*N];ll a[4*N],b[4*N];int n;void NTT(ll *f,int c){ for(reg i=0;i =1;--i) inv[i]=inv[i+1]*(i+1)%mod; for(reg i=1;i<=n;++i) ni[i]=((mod-mod/i)*ni[mod%i]+mod)%mod; for(reg i=0;i<=n;++i){ if(i&1) a[i]=mod-inv[i]; else a[i]=inv[i]; if(i==1) b[i]=n+1; else if(i==0) b[i]=1; else b[i]=(qm(i,n+1)-1+mod)%mod*qm(i-1,mod-2)%mod*inv[i]%mod; } int m; int lp=n; for(m=n+n,n=1;n<=m;n<<=1); for(reg i=0;i >1]>>1)|((i&1)?n>>1:0); }// for(reg i=0;i