公约数的和

传送门


放在这么前面的位置当然是给自己看的!!!!!



这一步原来是这么推过来的!如果下次再忘了怎么推可以这么搞出来或者直接记结论


分析

这道题很显然答案为

\[Ans=\sum_{i=1}^n\sum_{j=i+1}^n (i,j)
\]

//其中\((i,j)\)意味\(gcd(i,j)\)

这样做起来很烦,看起来是\(O(N^2)\)的辣鸡复杂度,我们考虑这个问题的弱化版

求$$\sum_{i=1}n\sum_{j=1}n(i,j)$$

然后通过一些优美的容斥就可以算出原答案

现在我们设$$f(d)=\sum_{i=1}n\sum_{j=1}n[(i,j)=d]$$

这个式子表示,在\(i=1..n,j=1..n,gcd(i,j)=d\)的个数,其中\([]\)内成立,返回值为\(1\),否则为\(0\)

我们令

\[F(n)=\sum_{n|d}f(d)=\lfloor\frac N n\rfloor^2
\]

则有

\[f(n)=\sum_{n|d}\mu(\frac d n)F(d)$$$$=\sum_{n|d}\mu(\frac d n)\lfloor\frac N d\rfloor^2
\]

考虑\(Ans\)

\[Ans=\sum_{i=1}^n\sum_{j=1}^n(i,j)
\]

\[=\sum_{d=1}^n d\sum_{i=1}^n\sum_{j=1}^n[(i,j)=d]
\]

\[=\sum_{d=1}^n d\;f(d)
\]

考虑把\(f(d)\)的式子带入,这时我们不枚举\(d\)的倍数具体是多少,而是枚举倍数(不枚举\(d|n\)的\(n\),而是枚举\(\frac n d\),比如说我们用\(k\)表示,就有

\[=\sum_{d=1}^N d \sum_{k=1}^N\mu(k)\lfloor\frac{N}{dk}\rfloor^2
\]

这个\(dk\)感觉不是很舒服,我们令\(t=dk,将枚举d改为枚举dk,则有\)

\[=\sum_{t=1}^N\sum_{k|t} k\mu(\frac{t}{k})\lfloor\frac{N}{t}\rfloor^2
\]

观察$$\sum_{k|t} k\mu(\frac{t}{k})$$

我们发现这是在前文提及的狄利克雷卷积

\[\mu\times d=\phi
\]

(忘了的话戳这里)

本篇·莫比乌斯反演

那么原式就优美的化简为

\[\sum_{t=1}^N\phi(t)\lfloor\frac{N}{t}\rfloor^2
\]

这样一个式子已经可以\(O(N)\)地解决了,更优美地也可以进行整除分块,做到计算\(\sqrt{n}\)

关于最前面的容斥,只需要减去\(gcd(i,i)=i\)和\(gcd(i,j)=gcd(j,i)\)的情况就可以

对于\(gcd(i,i)=i\)的情况,考虑在\(\sum_{i=1}^n\sum_{j=1}^n(i,j)\)中,对于每个\(i\),有且仅有\(1\)个\(j=i\)对应,此时的贡献为\(i\),所以总贡献为

\(\sum_{i=1}^N i=N(N+1)/2\)

而\(gcd(i,j)=gcd(j,i)\)的情况,去掉情况\(1\)后显然这两个对半分,只要\(/2\)即可

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=2000010;
LL sum[maxn];
int vis[maxn],phi[maxn],pri[maxn];
int cnt=0,n;
inline void getphi(int n){
memset(vis,0,sizeof(vis));phi[1]=vis[1]=1;
for (int i=2;i<=n;i++){
if (!vis[i]){pri[++cnt]=i;phi[i]=i-1;}
for (int j=1;j<=cnt&&(LL)i*pri[j]<=n;j++){
vis[i*pri[j]]=1;
if (i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}
else phi[i*pri[j]]=phi[i]*(pri[j]-1);
}
}
for (int i=1;i<=n;i++) sum[i]=sum[i-1]+phi[i];
}
int main(){
scanf("%d",&n);
getphi(n);
LL ans=0;
for (int l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans+=(LL)(sum[r]-sum[l-1])*(n/l)*(n/l);
}
printf("%lld",(ans-(LL)n*(n+1)/2)/2);
return 0;
}

[洛谷P1390]公约数的和·莫比乌斯反演的更多相关文章

  1. 洛谷 - P1390 - 公约数的和 - 莫比乌斯反演 - 欧拉函数

    https://www.luogu.org/problemnew/show/P1390 求 $\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m} gcd(i,j) $ ...

  2. 洛谷P2257 YY的GCD 莫比乌斯反演

    原题链接 差不多算自己推出来的第一道题QwQ 题目大意 \(T\)组询问,每次问你\(1\leqslant x\leqslant N\),\(1\leqslant y\leqslant M\)中有多少 ...

  3. 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)

    题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...

  4. 洛谷 P5518 - [MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题(莫比乌斯反演+整除分块)

    洛谷题面传送门 一道究极恶心的毒瘤六合一题,式子推了我满满两面 A4 纸-- 首先我们可以将式子拆成: \[ans=\prod\limits_{i=1}^A\prod\limits_{j=1}^B\p ...

  5. 洛谷 - P4449 - 于神之怒加强版 - 莫比乌斯反演

    https://www.luogu.org/problemnew/show/P4449 \(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{i=1}^{m} gcd(i, ...

  6. 洛谷 - SP3871 GCDEX - GCD Extreme - 莫比乌斯反演

    易得 $\sum\limits_{g=1}^{n} g \sum\limits_{k=1}^{n} \mu(k) \lfloor\frac{n}{gk}\rfloor \lfloor\frac{n}{ ...

  7. 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛

    题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...

  8. 洛谷P1390 公约数的和 [2017年6月计划 数论12]

    P1390 公约数的和 题目描述 有一天,TIBBAR和LXL比赛谁先算出1~N这N个数中每任意两个不同的数的最大公约数的和.LXL还在敲一个复杂而冗长的程序,争取能在100s内出解.而TIBBAR则 ...

  9. 洛谷P3455 [POI2007]ZAP-Queries (莫比乌斯反演)

    题意:求$\sum_{i=1}^{a}\sum_{j=1}^{b}[gcd(i,j)==d]$(1<=a,b,d<=50000). 很套路的莫比乌斯反演. $\sum_{i=1}^{n}\ ...

随机推荐

  1. python 中函数

    函数   def 函数名(形参):形参不用在前面定义,局部变量   参数      必须参数            必须以正确的顺序传参      关键字参数        加入关键字后可以不需要正确 ...

  2. 类数组转数组Array.prototype.slice.call(arrayLike)

    转换方式:Array.prototype.slice.call(arrayLike) 附:(http://www.jianshu.com/p/f8466e83cef0) 首先Array.prototy ...

  3. 15_volatile

    [volatile概念] volatile关键字的主要作用是是变量在多个线程间可见. [注意] 在java中,每一个线程都会有一块工作内存区,其中存放着所有线程共享的主内存中的变量的拷贝.当线程执行时 ...

  4. SpannableString与SpannableStringBuilder使用

    转自:http://blog.it985.com/14433.html1.SpannableString.SpannableStringBuilder与String的关系 首先SpannableStr ...

  5. Scope_Pre_Post

    @Scope , 设置bean的生命周期,示例:   @Scope(value="prototype")//设置生存范围,一般用 singleton或prototype 14.@P ...

  6. 在crontab中执行脚本重要事项

    crontab不能成功执行shell脚本的可能原因 crond进程不存在,该进程是crontab的守护进程,它必须存在才能让crontab正常使用: 系统时间不对: 环境变量的问题:crontab执行 ...

  7. 如何将使用托管磁盘虚拟机的 OS 盘挂载到其他虚拟机上

    适用场景 当出现虚拟机无法启动等情况时,需要将虚拟机的 OS 磁盘挂载到其他虚拟机上进行问题诊断或者数据恢复.使用托管磁盘的虚拟机无法通过存储浏览器等工具进行管理,只能通过 PowerShell 来操 ...

  8. Excel数据导入Sql Server,部分数字为Null

    在Excel中,我们时常会碰到这样的字段(最常见的就是电话号码),即有纯数字的(如没有带区号的电话号码),又有数字和其它字符混合 (如“区号-电 话号码”)的数据,在导入SQLServer过程中,会发 ...

  9. 关于使用metronic时里modal模拟框使用ueditor时不能全屏的情况

    ueditor里有这么断代码, 1.初始显示状态下(非全屏),修改一下代码的z-index UE.Editor.defaultOptions = function(editor){ var _url ...

  10. PB调用C#编写的DLL

    C#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了 ...