Codeforces.871D.Paths(莫比乌斯反演 根号分治)
\(Description\)
给定\(n\),表示有一张\(n\)个点的无向图,两个点\(x,y\)之间有权值为\(1\)的边当且仅当\(\gcd(x,y)\neq1\)。求\(1\sim n\)任意两点之间的最短路长度的和是多少。两个点不连通最短路长度为\(0\)。
\(n\leq10^7\)。
\(Solution\)
具体看这里吧,前面也挺重要的但我不抄了就简单记一下了(好像反而写的很详细了)。
先分类讨论一下,然后记\(mn_x\)为\(x\)的最小质因子,主要的问题在于求:$$\sum_{x,y}[\gcd(x,y)=1][mn_x\times mn_y\leq n]$$
反演一下(当然下面这个式子求出来要除以\(2\)):$$\begin{aligned}上式&=\sum_{d=1}^n\mu(d)\sum_{d\mid x}\sum_{d\mid y}[mn_x\times mn_y\leq n]\&=\sum_{x=1}n\sum_{y=1}n[mn_x\times mn_y\leq n]+\sum_{d=2}^n\mu(d)\sum_{d|x}\sum_{d|y}[mn_x\times mn_y\leq n]\end{aligned}$$
前面部分可以直接拿个桶然后前缀和一下。对于后面的部分,我们考虑:
- \(d\leq\sqrt n\)时,因为\(d\mid x\),所以有\(mn_x\leq mn_d\),即一定有\(mn_x\times mn_y\leq n\)。那么合法方案数是\(\lfloor\frac nd\rfloor^2\)。
- \(d>\sqrt n\)时,设\(x=k_1d,y=k_2d\),那么有\(k_1,k_2\leq\sqrt n\)。\(k_1,k_2\neq1\)时,\(k_1\times k_2\leq n\)显然合法。
\(k\)有一个是\(1\)时,假设是\(k_2\),\(mn_x\times mn_y\)就是\(k_1d=x\),显然也是\(\leq n\)。
\(k_1=k_2=1\)时,若\(d\)不是质数,那么\(d\)一定存在一个因子\(\leq\sqrt n\),那么也有\(mn_x\times mn_y=mn_d^2\leq n\)。
所以当且仅当\(k_1=k_2=1\)且\(d\)为质数时,\((x,y)\)不合法。那么合法方案数就是\(\lfloor\frac nd\rfloor^2\)-1。
那么枚举\(d\)就可以求出答案啦。
//296ms 161300KB
#include <cmath>
#include <cstdio>
#include <algorithm>
typedef long long LL;
const int N=1e7+5;
int P[N>>3],phi[N],mu[N],mn[N],cnt[N];
void Init(const int n)
{
phi[1]=mu[1]=1;
for(int i=2,cnt=0; i<=n; ++i)
{
if(!mn[i]) P[++cnt]=mn[i]=i, phi[i]=i-1, mu[i]=-1;
for(int j=1,v; j<=cnt&&(v=i*P[j])<=n; ++j)
{
mn[v]=P[j];
if(i%P[j]) phi[v]=phi[i]*(P[j]-1), mu[v]=-mu[i];
else {phi[v]=phi[i]*P[j], mu[v]=0; break;}
}
}
}
int main()
{
int n; scanf("%d",&n); Init(n);
LL ans=0,t2=0,t3=0,tot=0;
for(int i=2,half=n>>1; i<=n; ++i) if(mn[i]!=i||i<=half) ++tot, t2+=i-1-phi[i], ++cnt[mn[i]];
tot=tot*(tot-1)>>1;//总合法对数
for(int i=2; i<=n; ++i) cnt[i]+=cnt[i-1];
for(int i=2,half=n>>1; i<=n; ++i) if(mn[i]!=i||i<=half) t3+=cnt[n/mn[i]];
for(int d=2,m=sqrt(n); d<=n; ++d)
{
LL tmp=1ll*(n/d)*(n/d);
if(d>m&&mn[d]==d) --tmp;
t3+=mu[d]*tmp;
}
t3>>=1, ans+=t2+(t3<<1)+(tot-t2-t3)*3;
printf("%I64d\n",ans);
return 0;
}
Codeforces.871D.Paths(莫比乌斯反演 根号分治)的更多相关文章
- [Codeforces]871D Paths
失踪OJ回归. 毕竟这样的数论没做过几道,碰上一些具体的应用还是无所适从啊.小C还是借助这题大致摸索一下莫比乌斯函数吧. Description 有n个点,标号为1~n,为这n个点建一张无向图.两个点 ...
- Codeforces 348C - Subset Sums(根号分治)
题面传送门 对于这类不好直接维护的数据结构,第一眼应该想到-- 根号分治! 我们考虑记[大集合]为大小 \(\geq\sqrt{n}\) 的集合,[小集合]为大小 \(<\sqrt{n}\) 的 ...
- Codeforces 871D Paths (欧拉函数 + 结论)
题目链接 Round #440 Div 1 Problem D 题意 把每个数看成一个点,如果$gcd(x, y) \neq 1$,则在$x$和$y$之间连一条长度为$1$的无向边. ...
- Luogu4240 毒瘤之神的考验 莫比乌斯反演、根号分治
传送门 首先有\(\varphi(ij) = \frac{\varphi(i) \varphi(j) \gcd(i,j)}{\varphi(\gcd(i,j))}\),把欧拉函数的定义式代入即可证明 ...
- Codeforces 809E - Surprise me!(虚树+莫比乌斯反演)
Codeforces 题目传送门 & 洛谷题目传送门 1A,就 nm 爽( 首先此题一个很棘手的地方在于贡献的计算式中涉及 \(\varphi(a_ia_j)\),而这东西与 \(i,j\) ...
- codeforces#1139D. Steps to One (概率dp+莫比乌斯反演)
题目链接: http://codeforces.com/contest/1139/problem/D 题意: 在$1$到$m$中选择一个数,加入到一个初始为空的序列中,当序列的$gcd$和为$1$时, ...
- Codeforces 1039D You Are Given a Tree [根号分治,整体二分,贪心]
洛谷 Codeforces 根号分治真是妙啊. 思路 考虑对于单独的一个\(k\)如何计算答案. 与"赛道修建"非常相似,但那题要求边,这题要求点,所以更加简单. 在每一个点贪心地 ...
- UOJ#33. 【UR #2】树上GCD 点分治 莫比乌斯反演
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ33.html 题解 首先我们把问题转化成处理一个数组 ans ,其中 ans[i] 表示 d(u,a) 和 ...
- 【CodeForces】915 G. Coprime Arrays 莫比乌斯反演,前缀和,差分
Coprime Arrays CodeForces - 915G Let's call an array a of size n coprime iff gcd(a1, a2, ..., *a**n) ...
随机推荐
- 初识 go 语言:方法,接口及并发
目录 方法,接口及并发 方法 接口 并发 信道 结束语 前言: go语言的第四篇文章,主要讲述go语言中的方法,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示例,可直接运行. 方法,接 ...
- halcon预处理函数
颜色空间变换 trans_from_rgb(ImageRed, ImageGreen, ImageBlue :ImageResult1, ImageResult2, ImageResult3 : Co ...
- js获取url参数(通用方法)
function getUrl(name="") { var url = location.search; //获取url中"?"符后的字串 var theRe ...
- 一条sql执行过长的时间,你如何优化,从哪些方面?
1.查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化) 2.涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合 3. ...
- Jumbo frame与MTU
最近有测试问我Jumbo和MTU分别限制的是什么把我问住了,网上查了一些资料,发现大部分是百科上copy下来的,都没有说到点子上,关键时刻还是同事靠谱,现在根据自己的理解整理一下. 首先了解一下二 ...
- SpringMVC中的数据绑定(也就是参数的接收)
spirngMVC中的数据绑定类型,分为默认数据类型,简单数据类型,pojo类型,包装的pojo类型,绑定数组类型,绑定集合类型,还有自定定义数据绑定. 例如默认数据类型的绑定@RequestMapp ...
- python3 使用pip安装(命令行中)失败或 “not a supported wheel” 解决方案!
原因1: 安装的不是对应python版本的库,下载的库名中cp36代表python3.6,其它同理. 原因2:(我遇到的情况----下载的是对应版本的库,然后仍然提示不支持当前平台) 百度了一下,说法 ...
- vueRouter lazyLoad
import Vue from 'vue' import Router from 'vue-router' import HelloWorld from '@/components/hello/ind ...
- mysql索引与查询优化
索引加锁 对于InnoDB来说,索引可以让查询锁住更少的行,从而可以在并发情况下拥有更佳表现. 下面演示一下查询锁与索引之间的关系. 前面使用的t_user_action_log表目前有一个id为主键 ...
- Python Libhunt
有一个网站,Python Libhunt: https://python.libhunt.com 这个网站类似于Github的Awesome xxx系列,不过它是随时更新的,排序方式,分类也更加友好. ...