E. Surprise me!(莫比乌斯反演 + 虚树 DP)

E. Surprise me!

∑i=1n∑j=1nϕ(ai×aj)d(i,j)设pai=i∑i=1n∑j=1nϕ(i×j)d(pi,pj)∑i=1n∑j=1nϕ(i)ϕ(j)ϕ(gcd⁡(i,j))×gcd⁡(i,j)×d(pi,pj)∑d=1ndϕ(d)∑i=1nd∑j=1ndϕ(id)ϕ(jd)×d(pid,pjd)[gcd⁡(i,j)=1]∑d=1ndϕ(d)∑k=1ndμ(k)∑i=1nkd∑j=1nkdϕ(ikd)ϕ(jkd)×d(pikd,pjkd)T=kd∑T=1n(∑i=1nT∑j=1nTϕ(iT)ϕ(jT)×d(piT,pjT))∑d∣Tdϕ(d)×μ(Td)\sum_{i = 1} ^{n} \sum_{j = 1} ^{n} \phi(a_i \times a_j) d(i, j)\\ 设p_{a_i} = i\\ \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} \phi(i \times j) d(p_i, p_j)\\ \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} \frac{\phi(i) \phi(j)}{\phi(\gcd(i, j))} \times \gcd(i, j) \times d(p_i, p_j)\\ \sum_{d = 1} ^{n} \frac{d}{\phi(d)} \sum_{i = 1} ^{\frac{n}{d}} \sum_{j = 1} ^{\frac{n}{d}} \phi(id) \phi(jd) \times d(p_{id}, p_{jd})[\gcd(i, j) = 1]\\ \sum_{d = 1} ^{n} \frac{d}{\phi(d)} \sum_{k = 1} ^{\frac{n}{d}} \mu(k) \sum_{i = 1} ^{\frac{n}{kd}} \sum_{j = 1} ^{\frac{n}{kd}} \phi(ikd) \phi(jkd) \times d(p_{ikd}, p_{jkd})\\ T = kd\\ \sum_{T = 1} ^{n} \left(\sum_{i = 1} ^{\frac{n}{T}} \sum_{j = 1} ^{\frac{n}{T}} \phi(iT) \phi(jT) \times d(p_{iT}, p_{jT}) \right) \sum_{d \mid T} \frac{d}{\phi(d)} \times \mu(\frac{T}{d})\\ i=1nj=1nϕ(ai×aj)d(i,j)pai=ii=1nj=1nϕ(i×j)d(pi,pj)i=1nj=1nϕ(gcd(i,j))ϕ(i)ϕ(j)×gcd(i,j)×d(pi,pj)d=1nϕ(d)di=1dnj=1dnϕ(id)ϕ(jd)×d(pid,pjd)[gcd(i,j)=1]d=1nϕ(d)dk=1dnμ(k)i=1kdnj=1kdnϕ(ikd)ϕ(jkd)×d(pikd,pjkd)T=kdT=1ni=1Tnj=1Tnϕ(iT)ϕ(jT)×d(piT,pjT)dTϕ(d)d×μ(dT)

我们设h(n)=∑d∣ndϕ(d)×μ(nd)h(n) = \sum\limits_{d \mid n} \frac{d}{\phi(d)} \times \mu(\frac{n}{d})h(n)=dnϕ(d)d×μ(dn),应该是个积性函数吧,但是O(nlog⁡n)O(n \log n)O(nlogn)方便,,,

考虑如何求解F(T)=∑i=1nT∑j=1nTϕ(iT)ϕ(jT)×d(piT,pjT)F(T) = \sum\limits_{i = 1} ^{\frac{n}{T}} \sum\limits_{j = 1} ^{\frac{n}{T}} \phi(iT) \phi(jT) \times d(p_{iT}, p_{jT})F(T)=i=1Tnj=1Tnϕ(iT)ϕ(jT)×d(piT,pjT),为了方便,简化为T=1T = 1T=1的情况。

∑i=1n∑j=1nϕ(i)ϕ(j)×d(pi,pj)=∑i=1nϕ(i)∑j=1nϕ(j)×d(pi,pj)\sum\limits_{i = 1} ^{n} \sum\limits_{j = 1} ^{n} \phi(i) \phi(j) \times d(p_i, p_j) = \sum\limits_{i = 1} ^{n} \phi(i)\sum\limits_{j = 1} ^{n} \phi(j) \times d(p_i, p_j)i=1nj=1nϕ(i)ϕ(j)×d(pi,pj)=i=1nϕ(i)j=1nϕ(j)×d(pi,pj)

在这里插入图片描述

考虑信息在两棵子树上合并,∑i∈Uw(i)∑j∈Vw(j)×d(i×j)=∑i∈Uw(i)∑j∈Vw(j)×(d(i,u)+len+d(v,j))\sum\limits_{i \in U} w(i) \sum\limits_{j \in V} w(j) \times d(i \times j) = \sum\limits_{i \in U} w(i) \sum\limits_{j \in V} w(j) \times (d(i, u) + len + d(v, j))iUw(i)jVw(j)×d(i×j)=iUw(i)jVw(j)×(d(i,u)+len+d(v,j))
∑i∈Uw(i)×d(i,u)∑j∈Vw(j)+len∑i∈Uw(i)∑j∈Vw(j)+∑i∈Uw(i)∑j∈Vw(j)×d(v,j)\sum_{i \in U} w(i) \times d(i, u) \sum_{j \in V} w(j) + len \sum_{i \in U} w(i) \sum_{j \in V} w(j) + \sum_{i \in U} w(i) \sum_{j \in V} w(j) \times d(v, j)\\ iUw(i)×d(i,u)jVw(j)+leniUw(i)jVw(j)+iUw(i)jVw(j)×d(v,j)
于是设f(x)=∑i∈Xw(i)×d(i,x),g(x)=∑j∈Xw(j)f(x) = \sum\limits_{i \in X} w(i) \times d(i, x), g(x) = \sum\limits_{j \in X} w(j)f(x)=iXw(i)×d(i,x),g(x)=jXw(j),于是有上式子为f(U)×g(V)+len×g(U)×g(v)+g(U)×f(V)f(U) \times g(V) + len \times g(U) \times g(v) + g(U) \times f(V)f(U)×g(V)+len×g(U)×g(v)+g(U)×f(V)

同样地,对于f(x),g(x)f(x), g(x)f(x),g(x)的转移也比较简单,f(U)=f(U)+len×g(V)+f(V),g(U)=g(U)+g(V)f(U) = f(U) + len \times g(V) + f(V), g(U) = g(U) + g(V)f(U)=f(U)+len×g(V)+f(V),g(U)=g(U)+g(V)

那么F(U)=F(U)+F(V)+(f(U)×g(V)+len×g(U)×g(v)+g(U)×f(V))F(U) = F(U) + F(V) + \left(f(U) \times g(V) + len \times g(U) \times g(v) + g(U) \times f(V)\right)F(U)=F(U)+F(V)+(f(U)×g(V)+len×g(U)×g(v)+g(U)×f(V)),最后即可得到我们所要的答案。

上面的计算可以用虚树求解,这道题的整体复杂度O(nlog⁡2n)O(n \log ^ 2 n)O(nlog2n)

#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 10, mod = 1e9 + 7;int head[N], to[N << 1], nex[N << 1], cnt = 1;int son[N], sz[N], fa[N], dep[N], id[N], top[N], tot;int n, a[N], p[N], stk[N], prime[N], phi[N], mu[N], h[N], inv[N], num, tp;int f[N], g[N], F[N], w[N];vector< pair<int, int> > G[N];bool st[N];inline int Add(int x, int y) {return x + y < mod ? x + y : x + y - mod;
}inline int Sub(int x, int y) {return x >= y ? x - y : x - y + mod;
}void init() {phi[1] = mu[1] = inv[1] = 1;for (int i = 2; i < N; i++) {inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;if (!st[i]) {prime[++num] = i;mu[i] = -1;phi[i] = i - 1;}for (int j = 1; j <= num && 1ll * i * prime[j] < N; j++) {st[i * prime[j]] = 1;if (i % prime[j] == 0) {phi[i * prime[j]] = phi[i] * prime[j];break;}mu[i * prime[j]] = -mu[i];phi[i * prime[j]] = phi[i] * (prime[j] - 1);}}for (int i = 1; i < N; i++) {for (int j = i; j < N; j += i) {if (mu[j / i]) {if (mu[j / i] == -1) {h[j] = Sub(h[j], 1ll * i * inv[phi[i]] % mod);}else {h[j] = Add(h[j], 1ll * i * inv[phi[i]] % mod);}}}}
}void add(int x, int y) {to[cnt] = y;nex[cnt] = head[x];head[x] = cnt++;
}int lca(int u, int v) {while (top[u] != top[v]) {if (dep[top[u]] < dep[top[v]]) {swap(u, v);}u = fa[top[u]];}return dep[u] < dep[v] ? u : v;
}void dfs1(int rt, int f) {sz[rt] = 1, dep[rt] = dep[f] + 1, fa[rt] = f, id[rt] = ++tot;for (int i = head[rt]; i; i = nex[i]) {if (to[i] == f) {continue;}dfs1(to[i], rt);sz[rt] += sz[to[i]];if (!son[rt] || sz[to[i]] > sz[son[rt]]) {son[rt] = to[i];}}
}void dfs2(int rt, int tp) {top[rt] = tp;if (!son[rt]) {return; }dfs2(son[rt], tp);for (int i = head[rt]; i; i = nex[i]) {if (to[i] == fa[rt] || to[i] == son[rt]) {continue;}dfs2(to[i], to[i]);}
}bool cmp(int a, int b) {return id[a] < id[b];
}void dp(int u, int fa) {f[u] = 0, g[u] = w[u], F[u] = 0;for (auto to : G[u]) {int len = to.second, v = to.first;if (v == fa) {continue;}dp(v, u);F[u] = Add(Add(F[u], F[v]), Add(Add(1ll * f[u] * g[v] % mod, 1ll * len * g[u] % mod * g[v] % mod), 1ll * g[u] * f[v] % mod));f[u] = Add(Add(f[u], f[v]), 1ll * len * g[v] % mod);g[u] = Add(g[u], g[v]);}G[u].clear();
}void insert(int rt) {if (tp == 1) {if (rt != 1) {stk[++tp] = rt;}return ;}int lc = lca(rt, stk[tp]);if (lc == stk[tp]) {stk[++tp] = rt;return ;}while (tp > 1 && id[stk[tp - 1]] >= id[lc]) {int u = stk[tp - 1], v = stk[tp];G[u].push_back({v, dep[v] - dep[u]});tp--;}if (stk[tp] != lc) {int u = lc, v = stk[tp];G[u].push_back({v, dep[v] - dep[u]});stk[tp] = lc;}stk[++tp] = rt;
}int calc(int T) {int tot = 0;for (int i = T; i <= n; i += T) {a[++tot] = p[i];w[p[i]] = phi[i];}sort(a + 1, a + 1 + tot, cmp);stk[tp = 1] = 1;for (int i = 1; i <= tot; i++) {insert(a[i]);}while (tp > 1) {int u = stk[tp - 1], v = stk[tp];G[u].push_back({v, dep[v] - dep[u]});tp--;}dp(1, 0);for (int i = 1; i <= tot; i++) {w[a[i]] = 0;}return F[1];
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);init();scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);p[a[i]] = i;}for (int i = 1, u, v; i < n; i++) {scanf("%d %d", &u, &v);add(u, v);add(v, u);}dfs1(1, 0);dfs2(1, 1);int ans = 0;for (int i = 1; i <= n; i++) {ans = Add(ans, 1ll * calc(i) * h[i] % mod);}printf("%lld\n", 1ll * ans * inv[n] % mod * inv[n - 1] % mod * 2 % mod);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hibernate 的缓存机制

** 1、Hibernate 应用程序中按照缓存的范围&#xff0c;可以将缓存分为三类 ** &#xff08;1.1&#xff09;事务范围缓存&#xff08;单Session&#xff0c;即一级缓存&#xff09; 事务范围的缓存只能被当前事务访问&#xff0c;每个事务都有各自的缓存。缓存的生命周期依…

.NET分布式大规模计算利器-Orleans(一)

写在前面Orleans是基于Actor模型思想的.NET领域的框架&#xff0c;它提供了一种直接而简单的方法来构建分布式大规模计算应用程序&#xff0c;而无需学习和应用复杂的并发或其他扩展模式。我在2015年下半年开始应用Orleans&#xff0c;当时公司的交易系统采用的架构就是基于Orl…

吉哥系列故事——恨7不成妻(数位 DP)

吉哥系列故事——恨7不成妻 ∑i1n(presuc)2∑i1npre2suc22presucnpre2∑suc22pre∑suc\sum_{i 1} ^{n}(pre suc) ^ 2\\ \sum_{i 1} ^{n} pre ^ 2 suc ^ 2 2 \times pre \times suc\\ n \times pre ^ 2 \sum suc ^ 2 2 \times pre \sum suc\\ i1∑n​(presuc)2i1∑n​pre…

Hibernate与MyBatis对比

1、Hibernate与MyBatis简单介绍 Hibernate 是当前最流行的O/R mapping框架&#xff0c;它来自于 sf.net&#xff0c;现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。 MyBatis 参考资料官网&#xff1a;http://www.mybat…

Hive-DML详解(超详细)

文章目录 前言HiveQL的数据操作语言&#xff08;DML&#xff09;1. 插入数据1.1 直接插入固定值1.2 插入查询结果 2. 更新数据3. 删除数据3.1 删除整个分区 4. 查询数据4.1 基本查询4.2 条件筛选4.3 聚合函数 总结 前言 本文将介绍HiveQL的数据操作语言&#xff08;DML&#x…

从单机应用到微服务,用户认证走几步?

用户认证指在用户访问服务的时候确认用户的身份&#xff0c;受限于HTTP无状态的特性&#xff0c;应用开发者需要自行实现用户认证相关功能。通常是用户登录时服务端生成通行证返回给客户端&#xff0c;客户端在接下来的请求中携带通行证&#xff0c;然后服务端通过校验该通行证…

P5175 数列(矩阵快速幂)

P5175 数列 anb(xan−1yan−2)2x2an−12y2an−222xyan−1an−2x2an−12y2an−222xyan−2(xan−2yan−3)x2an−12y2an−222xy(xan−22yan−2an−3)a_n ^ b \left(x \times a_{n - 1} y \times a_{n - 2}\right) ^ 2\\ x ^ 2 \times a_{n - 1} ^ 2 y ^ 2 \times a_{n - 2} ^ 2…

Spring bean 的初始化

先mark&#xff1a; https://www.cnblogs.com/yxh1008/p/6012230.html Bean的多种初始化、destory方法执行顺序 https://segmentfault.com/a/1190000014105687 https://blog.csdn.net/caihaijiang/article/details/8629725 Spring bean的初始化过程 https://www.jianshu.com…

编写优雅代码,从挖掉恶心的if/else 开始

背景长话短说&#xff0c; 作为开发人员经常需要根据条件灵活查询数据库&#xff0c;不管你是用rawsql 还是EFCore&#xff0c; 以下类似伪代码大家都可能遇到&#xff1a;特别是在大数据产品或者物联网产品中&#xff0c;字段甚多&#xff1b;if/else 写到死&#xff0c;一边写…

Spring bean 初始化顺序

InitializingBean, init-method 和 PostConstruct 1、概述 从接口的名字上不难发现&#xff0c;InitializingBean 的作用就是在 bean 初始化后执行定制化的操作。 Spring 容器中的 Bean 是有生命周期的&#xff0c;Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特…

不要666升级版(数位DP,三次方和)

不要666升级版 ∑(presuc)2npre22pre∑suc∑suc2\sum(pre suc) ^ 2\\ n \times pre ^ 2 2 \times pre \sum suc \sum suc ^ 2\\ ∑(presuc)2npre22pre∑suc∑suc2 ∑(presuc)3∑(pre33pre2suc3presuc2suc3)npre33pre2∑suc3pre∑suc2∑suc3\sum (pre suc) ^ 3\\ \sum \left…

.NET Conf 2019 大会上发布.NET Core 3.0

北京时间今天凌晨如期在.NET Conf 上发布.NET Core 3.0,Keynotes 由Scott Hunter 主演&#xff0c;主要围绕.NET Core 3.0的新特性和社区展开。多功能性是.Net Core 成为我们的生活一部分的最好解释。如果您是Web开发人员还是想开发桌面或移动应用程序&#xff0c;如果您是游戏…

Spring AOP实现原理

先说结论&#xff1a; Spring AOP采用的是JDK动态代理 CGLIB动态代理模式。当当前类为接口的实现时&#xff0c;采用JDK动态代理&#xff0c;否则用CGLIB、 1、AOP 的存在价值 在传统 OOP 编程里以对象为核心&#xff0c;整个软件系统由系列相互依赖的对象所组成&#xff0c…

J. Product of GCDs(莫比乌斯反演)(2021牛客暑期多校训练营2)

Product of GCDs ∏d1nd∑[gcd⁡(s1d,s2d,…,skd)1]∏d1nd∑i1ndμ(i)Cf[id]k\prod_{d 1} ^{n} d ^{\sum[\gcd(\frac{s_1}{d}, \frac{s_2}{d}, \dots, \frac{s_k}{d}) 1]}\\ \prod_{d 1} ^{n} d ^{\sum\limits_{i 1} ^{\frac{n}{d}} \mu(i) C_{f[id]} ^{k}}\\ d1∏n​d∑[g…

微软推出Python免费在线教程视频

开源中国曾报道过最近微软针对 Python 初学者&#xff0c;推出了一套免费的教程视频。这套视频名为 Python for Beginners&#xff0c;该在线教学视频由微软高级项目经理 Christopher Harrison、以及微软 AI Gaming 的商业开发经理 Susan Ibach 共同讲解&#xff0c;在课程中加…

徒手实现Spring的IOC

Mark https://www.jianshu.com/p/9fe5a3c25ab6 https://juejin.im/post/5abe75f351882577b45f2336 https://blog.csdn.net/u012373815/article/details/74937913 https://xilidou.com/2018/01/08/spring-ioc/ IOC原理介绍&#xff1a; http://www.importnew.com/14751.htm…

HDU6956-Pass!(2021杭电多校一)(BSGS)

Pass! f(1)0,f(2)n−1,f(t)(n−2)f(t−1)(t−1)f(t−2)f(1) 0, f(2) n - 1, f(t) (n - 2) \times f(t - 1) (t - 1) \times f(t - 2)f(1)0,f(2)n−1,f(t)(n−2)f(t−1)(t−1)f(t−2)&#xff0c;考虑对通项两边同时加一个xf(t−1)x \times f(t - 1)xf(t−1)。 可以得到f(t…

推荐neter常用优秀开源项目系列之一

.net社区有很多优秀的开源项目&#xff0c;我们今天先推荐6个开源项目&#xff1b;1.MassTransitMassTransit 是一个自由、开源、轻量级的消息总线, 用于使用. NET 框架创建分布式应用程序。MassTransit在现有消息传输上提供了一组广泛的功能, 从而使开发人员能够友好地使用基于…

spring四种依赖注入方式

平常的java开发中&#xff0c;程序员在某个类中需要依赖其它类的方法&#xff0c;通常是new一个依赖类再调用类实例的方法&#xff0c;这种开发存在的问题是new的类实例不好统一管理。 spring提出了依赖注入的思想&#xff0c;即依赖不由程序员控制&#xff0c;而是通过spring…

3085 吃遍赴丝码(分治)

3085 吃遍赴丝码 给定一个长度为nnn的数组&#xff0c;求∑i1n∑jin(j−i1)min{ai,…,aj}max{ai,…,aj}\sum\limits_{i 1} ^{n} \sum\limits_{j i} ^{n} (j - i 1) \times min\{a_i, \dots, a_j\} \times max\{a_i, \dots, a_j\}i1∑n​ji∑n​(j−i1)min{ai​,…,aj​}max…