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

博客探讨了在解决算法问题时使用分治NTT、树剖、SAM数据结构和概率DP的策略。在game部分,介绍了通过枚举路径和LCA来优化复杂度;在string部分,利用SAM结构处理字符串问题,复杂度为O(nlog^2n);在hunter部分,讨论了线性递推的高斯消元概率DP。博客作者反思了考试策略和对细节的忽视,强调对拍和细节的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

game

枚举被所有人经过的路径(u,v)(u,v)(u,v)(显然只有一条连续路径被所有人经过)。

考虑LCA(u,v)LCA(u,v)LCA(u,v)不为uuuvvv时,fu,fvf_u,f_vfu,fv分别表示在u,vu,vu,v子树中给KKK个人安排出起始点(可重合)的方案数。

发现fxf_xfx就是生成函数K!(∑i=0∞1i!)∏y∈sonx(1+szy⋅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)xKx^KxK项的系数。

分治NTT求出fxf_xfx的复杂度是degreexlog⁡2degreexdegree_x\log ^2 degree_xdegreexlog2degreex的,故总复杂度为nlog⁡2nn\log^2 nnlog2n

dfsdfsdfs一遍处理出不为祖先关系的点对答案。

对于LCA(u,v)=uLCA(u,v)=uLCA(u,v)=u的情况,设v∈x,x∈sonuv\in x,x\in son_uvx,xsonufuf_ufu需要乘上1+(n−szu)x1+szx\frac{1+(n-sz_u)x}{1+sz_{x}}1+szx1+(nszu)x,多项式乘或除另一个一次多项式的复杂度显然是线性的,而nnn个点的树中szxsz_xszx的值最多只有n\sqrt nn 种。复杂度是nnn\sqrt nnn 的。

总复杂度O(nn+nlog⁡2n)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;
}

inline void ad(int &x,int y){
   
   x+=y;if(x>=mod) x-=mod;}
inline void dc(int &x,int y){
   
   x-=y;if(x<0) x+=mod;}
inline int inc(int x,int y){
   
   x+=y;return x>=
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值