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) ...
随机推荐
- 基于Elastalert的安全告警剖析
https://www.freebuf.com/sectool/164591.html *本文作者:bigface,本文属 FreeBuf 原创奖励计划,未经许可禁止转载. elastalert 是一 ...
- Linux下安装部署Samba共享盘的操作手册
简述 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的 ...
- [物理学与PDEs]第4章第3节 一维反应流体力学方程组 3.2 一维反应流体力学方程组的 Lagrange 形式
1. 一维粘性热传导反应流体力学方程组的 Lagrange 形式 $$\beex \bea \cfrac{\p \tau}{\p t'}-\cfrac{\p u}{\p m}&=0,\\ \ ...
- react中input自动聚焦问题
input自动聚焦问题 在react中可以使用refs解决这个问题,首先看一下refs的使用场景: (1)处理焦点.文本选择或媒体控制. (2)触发强制动画. (3)集成第三方 DOM 库. 使用re ...
- Ubuntu 18.04 LTS搭建GO语言开发环境
一.下载Go语言安装包 官网下载地址:https://golang.org/dl/,使用tar命令将档案包解压到/usr/local目录中: sudo tar -C /usr/local -xzf g ...
- 【vue】路由配置
一般组件我们会有全屏组件,或是在页面的某个部分显示组件,所以路由的第一层一般是全屏显示的,而在/目录下的组件为页面的某个部分显示的,通常需求是这样的,登录是全屏显示的,而普通页面是在页面的某个部分进行 ...
- djang增删改查
创建表: from django.db import models class Publisher(models.Model): pid = models.AutoField(primary_key ...
- XSS闯关游戏准备阶段及XSS构造方法
请下载好XSS闯关文件后,解压后放在服务器的对应文件夹即可 在该闯关中,会在网页提示一个payload数值 payload,翻译过来是有效载荷 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批 ...
- 记事本:CSS
css更多的是一种用来修饰HTML的语言 CSS的三种引入方式 1.行内样式:一般不会这样写,如果想选择某一个,可以用之后内部样式中更加详细的选中方式 行内的优先级最高 <p style=&qu ...
- setTimeout 第三个参数秒懂
好吧,假设你们都是从 ES6 里 promise 发现 setTimeout 还有第三个参数的,下面讲讲到底是干嘛的 setTimeout 第三个及之后的参数作用:定时器启动时候,第三个以后的参数是作 ...