题目描述:
算法标签:斯特林树,分治ntt
思路:
对于固定一个点,讨论他有几个叶子的情况,观察规律发现他的系数斯特林数。于是我们可以求出对于每一个节点建成多少个联通快的方案树,再把每一个节点的方案书卷积起来,用分治ntt维护。
对于求斯特林数,可以先求出小的一部分,对于大的一部分,再用斯特林数的通式求法。
以下代码:
#include#define il inline#define LL long long#define vet vector #define _(d) while(d(isdigit(ch=getchar())))using namespace std;const int N=3e5+5,p=998244353;int G[2],jc[N],ny[N],in[N];int n,c,k,sz,s[318][318],a[N],b[N],num,sum[N];il int read(){ int x,f=1;char ch; _(!)ch=='-'?f=-1:f;x=ch^48; _()x=(x<<1)+(x<<3)+(ch^48); return f*x;}il int ksm(LL a,int y){ LL b=1; while(y){ if(y&1)b=b*a%p; a=a*a%p;y>>=1; } return b;}il int mu(int x,int y){ if(x+y>=p)return x+y-p; return x+y;}class ntt{ int v[N],t,l; il void init(int x){ t=1;l=0; while(t<=x)t<<=1,l++; for(int i=0;i >1]>>1)|((i&1)< >1))-sum-1; vet res1=Solve(l,mid),res2=Solve(mid+1,r),res; int s1=res1.size(),s2=res2.size(),s=s1+s2-1; res.resize(s); for(int i=0;i