题意:随机分治中心点分治的期望操作次数

n≤3×104n\leq 3\times 10^4n≤3×104

即求点分树的 siz 之和的期望

即祖孙关系对数期望

考虑一有序点对 (u,v)(u,v)(u,v),uuu 在点分树上是 vvv 祖先当且仅当 uuu 是 u∼vu\sim vu∼v 路径上第一个被选为分治中心的,并且选择路径外的点是不影响的,所以概率为 1dist⁡(u,v)+1\dfrac 1{\operatorname{dist}(u,v)+1}dist(u,v)+11​

由期望线性性,答案为

∑i=1n∑j=1n1dist⁡(i,j)+1\sum_{i=1}^n\sum_{j=1}^{n}\frac 1{\operatorname{dist}(i,j)+1}i=1∑n​j=1∑n​dist(i,j)+11​

相当于是求距离为 0∼n−10\sim n-10∼n−1 的点对数量,考虑点分治

计算当前答案时发现是个卷积形式,使用 NTT 优化

算出整个连通块的答案,然后容斥掉在同一个子树中的

因为深度是不会超过大小的,所以复杂度为 O(nlog⁡2n)O(n\log ^2n)O(nlog2n)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#define MAXN 65536
using namespace std;
const int MOD=998244353;
inline int add(const int& x,const int& y){return x+y>=MOD? x+y-MOD:x+y;}
inline int dec(const int& x,const int& y){return x<y? x-y+MOD:x-y;}
typedef long long ll;
inline int qpow(int a,int p)
{int ans=1;while (p){if (p&1) ans=(ll)ans*a%MOD;a=(ll)a*a%MOD,p>>=1;}return ans;
}
#define inv(x) qpow(x,MOD-2)
int rt[2][24];
int l,lim,r[MAXN];
inline void init(){lim=1<<l;for (int i=0;i<lim;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));}
inline void NTT(int* a,int type)
{for (int i=0;i<lim;i++) if (i<r[i]) swap(a[i],a[r[i]]);for (int L=0;L<l;L++){int mid=1<<L,len=mid<<1;ll Wn=rt[type][L+1];for (int s=0;s<lim;s+=len)for (int k=0,w=1;k<mid;k++,w=w*Wn%MOD){int x=a[s+k],y=(ll)w*a[s+mid+k]%MOD;a[s+k]=add(x,y),a[s+mid+k]=dec(x,y);}}if (type){int t=inv(lim);for (int i=0;i<lim;i++) a[i]=(ll)a[i]*t%MOD;}
}
inline double calc(int* a,int n)
{double ans=0;for (l=0;(1<<l)<=(n<<1);++l);init(),NTT(a,0);for (int i=0;i<lim;i++) a[i]=(ll)a[i]*a[i]%MOD;NTT(a,1);for (int i=0;i<lim;i++){ans+=(double)a[i]/(i+1);a[i]=0;}return ans;
}
vector<int> e[MAXN];
double ans;
bool vis[MAXN];
int siz[MAXN],maxp[MAXN]={0x7fffffff},Rt;
int a[MAXN];
void findrt(int u,int f,int sum)
{siz[u]=1,maxp[u]=0;for (int i=0;i<(int)e[u].size();i++)if (e[u][i]!=f&&!vis[e[u][i]]){findrt(e[u][i],u,sum);siz[u]+=siz[e[u][i]];maxp[u]=max(maxp[u],siz[e[u][i]]);}maxp[u]=max(maxp[u],sum-siz[u]);if (maxp[u]<maxp[Rt]) Rt=u;
}
int dfs(int u,int f,int dep)
{siz[u]=1,++a[dep];int mx=dep;for (int i=0;i<(int)e[u].size();i++)if (e[u][i]!=f&&!vis[e[u][i]]){mx=max(mx,dfs(e[u][i],u,dep+1));siz[u]+=siz[e[u][i]];}return mx;
}
inline void calc()
{ans+=calc(a,dfs(Rt,0,0));for (int i=0;i<(int)e[Rt].size();i++)if (!vis[e[Rt][i]])ans-=calc(a,dfs(e[Rt][i],0,1));
}
void solve()
{int u=Rt;vis[u]=1;calc();for (int i=0;i<(int)e[u].size();i++)if (!vis[e[u][i]]){int v=e[u][i];Rt=0,findrt(v,0,siz[v]);solve();}
}
int main()
{rt[0][23]=qpow(3,119),rt[1][23]=inv(rt[0][23]);for (int i=22;i>=0;i--){rt[0][i]=(ll)rt[0][i+1]*rt[0][i+1]%MOD;rt[1][i]=(ll)rt[1][i+1]*rt[1][i+1]%MOD;}int n;scanf("%d",&n);for (int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);++u,++v;e[u].push_back(v),e[v].push_back(u);}findrt(1,0,n);solve();printf("%.4f\n",ans);return 0;
}

【BZOJ3451】Normal【期望线性性】【点分治】【NTT卷积】相关推荐

  1. BZOJ3451 Normal 期望、点分治、NTT

    BZOJCH传送门 题目大意:给出一棵树,求对其进行随机点分治的复杂度期望 可以知道一个点的贡献就是其点分树上的深度,也就是这个点在点分树上的祖先数量+1. 根据期望的线性性,考虑一个点对\((x,y ...

  2. 关于期望线性性的探讨

    简单题意:给你n堆石头,每次随机选择一个石头,将那一堆的石头都扔掉,第一堆石头被扔的需要的期望次数. woc,今天竟然又没有做出期望的那道题. 我还是太垃圾了!!! 首先,再次反思: 真的理解了期望的 ...

  3. 【BZOJ - 3450】Tyvj1952 Easy(数学期望,期望的线性性)

    题干: 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就 ...

  4. 【BZOJ - 3036】绿豆蛙的归宿(概率DAG图dp,拓扑排序,概率dp,期望的线性性)

    题干: 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度.绿豆蛙从起点出发,走向终点. 到达每一个顶点时,如 ...

  5. 【2019牛客暑期多校训练营(第一场) - H】XOR(线性基,期望的线性性)

    题干: 链接:https://ac.nowcoder.com/acm/contest/881/H 来源:牛客网 Bobo has a set A of n integers a1,a2,-,ana1, ...

  6. 【洛谷P4705】玩游戏【二项式定理】【NTT卷积】【生成函数】【分治NTT】【函数求导】【多项式对数】

    传送门 题意:给定长度为N,MN,MN,M的序列a,ba,ba,b和ttt,随机选取x∈[1,N],y∈[1,M]x \in[1,N],y\in[1,M]x∈[1,N],y∈[1,M],对于i=1,2 ...

  7. [JZOJ5666]【GDOI2018Day2模拟4.18】法力风暴(分治NTT 模板)

    Description 有 2≤n≤105,0≤Ai,k≤109 2 ≤ n ≤ 10 5 , 0 ≤ A i , k ≤ 10 9 2 ≤ n ≤ 10^5 ,0 ≤ A_i ,k ≤ 10^9 S ...

  8. 【BZOJ-3456】城市规划 CDQ分治 + NTT

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=3456 Solution 这个问题可以考虑dp,利用补集思想 N个点的简单图总数量为$2^{ ...

  9. HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)

    题意  给定n个点,任意两点之间可以不连边也可以连边.如果连边的话可以染上m种颜色. 求最后形成的图,是一个带环连通图的方案数. 首先答案是n个点的图减去n个点能形成的树. n个点能形成的树的方案数比 ...

最新文章

  1. 《创业维艰分享之五》所有得,有所乐,日事日清,循序渐进。
  2. 《算法导论》(一)--插入排序与合并排序
  3. 概率编程库Pymc3案例之Coal mining disasters
  4. Windows下配置IDEA开发环境
  5. 【David Silver强化学习公开课】-6:Value Function Approximation
  6. 自己实现一个和PYTHON的库一模一样的sha_256算法
  7. 10分钟学会如何使用Shiro
  8. oracle输出xml文件格式,在oracle中通过字段信息生成xml文件
  9. [react] 在react中什么是合成事件?有什么用?
  10. MCMS 基于SpringBoot 2架构
  11. linux驱动初探之字符驱动
  12. Jmeter 接口自动化执行报错 无法找到类或者类的方法
  13. 谷歌浏览器无法定位程序输入点解决方法
  14. 阿尔法蛋机器人tf卡_入手评价科大讯飞阿尔法蛋S阿尔法蛋智能机器人功能优缺点评测...
  15. python3基础教程pdf下载-《Python基础教程》(第3版)pdf电子书百度网盘下载
  16. 使用 K-means 算法进行客户分类
  17. Revit中为房间添加填充图例和“构件快速上色”
  18. 《iOS APP 性能检测》
  19. CTF零基础--手把手带你如何下载调用dirsearch工具
  20. htc hd2刷android,真正的刷机之王! HTC HD2成功刷入安卓7.0

热门文章

  1. mysql mvcc 隔离级别_隔离级别和MVCC
  2. 女生来大姨妈该怎么哄她?
  3. 左手菲尔兹右手突破奖,这个中国女婿其实是英国贵族?拿到300万奖金后他这样说……...
  4. 把 14 亿中国人民都拉到一个微信群里在技术上能实现吗?
  5. 吃货都是怎么给自己找理由的? | 今日最佳
  6. Python为什么是编程语言中最skr的?
  7. 2017年终奖发放,程序员人均11776元排名第一!
  8. 数据挖掘算法之-关联规则挖掘(Association Rule)(购物篮分析)
  9. java赋值语句_java并发编程之原子性问题
  10. 布鲁克大学计算机科学,布鲁克大学计算机科学本科.pdf