【TEST190403】分治NTT & SAM+树剖 & 高斯消元+概率DP

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=0i!1)ysonx(1+szyx) 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 vx,xsonu 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+(nszu)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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值