game
枚举被所有人经过的路径 ( u , v ) (u,v) (u,v)(显然只有一条连续路径被所有人经过)。
考虑 L C A ( u , v ) LCA(u,v) LCA(u,v)不为 u u u或 v v v时, f u , f v f_u,f_v fu,fv分别表示在 u , v u,v u,v子树中给 K K K个人安排出起始点(可重合)的方案数。
发现 f x f_x fx就是生成函数 K ! ( ∑ i = 0 ∞ 1 i ! ) ∏ y ∈ s o n x ( 1 + s z y ⋅ x ) K!(\sum \limits_{i=0}^{\infty}\dfrac{1}{i!})\prod\limits_{y\in son_x}(1+sz_y·x) K!(i=0∑∞i!1)y∈sonx∏(1+szy⋅x)的 x K x^K xK项的系数。
分治NTT求出 f x f_x fx的复杂度是 d e g r e e x log 2 d e g r e e x degree_x\log ^2 degree_x degreexlog2degreex的,故总复杂度为 n log 2 n n\log^2 n nlog2n。
d f s dfs dfs一遍处理出不为祖先关系的点对答案。
对于 L C A ( u , v ) = u LCA(u,v)=u LCA(u,v)=u的情况,设 v ∈ x , x ∈ s o n u v\in x,x\in son_u v∈x,x∈sonu则 f u f_u fu需要乘上 1 + ( n − s z u ) x 1 + s z x \frac{1+(n-sz_u)x}{1+sz_{x}} 1+szx1+(n−szu)x,多项式乘或除另一个一次多项式的复杂度显然是线性的,而 n n n个点的树中 s z x sz_x szx的值最多只有 n \sqrt n n种。复杂度是 n n n\sqrt n nn的。
总复杂度 O ( n n + n log 2 n ) O(n\sqrt n+n\log^2 n) O(nn+nlog2n)
#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define sc second
using namespace std;
typedef long long ll;
const int N=1e5+100;
const int mod=998244353,g=3,nvg=332748118;
int num,n,m,ans,frac,nv[N];
int rep[N<<3],sz[N],sum[N],val[N];
int head[N],to[N<<1],nxt[N<<1],tot;
vector<int>xs[N];
map<int,int>mp[N];
char cp;
inline void rd(int &x)
{
cp=getchar();x=0;
for(;!isdigit(cp);cp=getchar());
for(;isdigit(cp);cp=getchar()) x=x*10+(cp^48);
}
inline int fp(int x,int y)
{
int re=1;
for(;y;y>>=1,x=(ll)x*x%mod)
if(y&1) re=(ll)re*x%mod;
return re