原题链接:https://www.luogu.org/problemnew/show/P1390

公约数的和

题目描述

有一天,TIBBAR和LXL比赛谁先算出1~N这N个数中每任意两个不同的数的最大公约数的和。LXL还在敲一个复杂而冗长的程序,争取能在100s内出解。而TIBBAR则直接想1s秒过而获得完胜,请你帮他完成这个任务。

输入输出格式
输入格式:

共一行,一个正整数N。

输出格式:

共一行,一个数,为1~N这N个数中每任意两个不同的数的最大公约数的和。

输入输出样例
输入样例#1:

10

输出样例#1:

67

说明

对于40%的数据,2≤N≤2000.

对于100%的数据,2≤N≤2000000.

题解

因为只有单组询问,所以可以用各种奇怪姿势过,这里还是直接上数论。

初始式子:

ans=∑i=1n∑j=1ngcd(i,j)ans=∑i=1n∑j=1ngcd(i,j)

ans=\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)

我们枚举最大公因数ddd:

ans=∑d=1nd∑i=1n∑j=1n[gcd(i,j)=d]" role="presentation">ans=∑d=1nd∑i=1n∑j=1n[gcd(i,j)=d]ans=∑d=1nd∑i=1n∑j=1n[gcd(i,j)=d]

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

日常提出ddd:

ans=∑d=1nd∑i=1⌊nd⌋∑j=1⌊nd⌋[gcd(i,j)=1]" role="presentation">ans=∑d=1nd∑i=1⌊nd⌋∑j=1⌊nd⌋[gcd(i,j)=1]ans=∑d=1nd∑i=1⌊nd⌋∑j=1⌊nd⌋[gcd(i,j)=1]

ans=\sum_{d=1}^nd\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[gcd(i,j)=1]

又是日常替换[gcd(i,j)=1][gcd(i,j)=1][gcd(i,j)=1]:

ans=∑d=1nd∑i=1⌊nd⌋∑j=1⌊nd⌋∑d′|gcd(i,j)μ(d′)ans=∑d=1nd∑i=1⌊nd⌋∑j=1⌊nd⌋∑d′|gcd(i,j)μ(d′)

ans=\sum_{d=1}^nd\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{d'|gcd(i,j)}\mu(d')

日常先枚举d′d′d':

ans=∑d=1nd∑d′=1nμ(d′)∑i=1⌊nd⌋∑j=1⌊nd⌋[d′|gcd(i,j)]ans=∑d=1nd∑d′=1nμ(d′)∑i=1⌊nd⌋∑j=1⌊nd⌋[d′|gcd(i,j)]

ans=\sum_{d=1}^nd\sum_{d'=1}^n\mu(d')\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[d'|gcd(i,j)]

再直接枚举d′d′d'的倍数:

ans=∑d=1nd∑d′=1nμ(d′)∑i=1⌊ndd′⌋∑j=1⌊ndd′⌋ans=∑d=1nd∑d′=1nμ(d′)∑i=1⌊ndd′⌋∑j=1⌊ndd′⌋

ans=\sum_{d=1}^nd\sum_{d'=1}^n\mu(d')\sum_{i=1}^{\lfloor\frac{n}{dd'}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{dd'}\rfloor}

ans=∑d=1nd∑d′=1nμ(d′)⌊ndd′⌋⌊ndd′⌋ans=∑d=1nd∑d′=1nμ(d′)⌊ndd′⌋⌊ndd′⌋

ans=\sum_{d=1}^nd\sum_{d'=1}^n\mu(d')\lfloor\frac{n}{dd'}\rfloor\lfloor\frac{n}{dd'}\rfloor

设T=dd′T=dd′T=dd',代入,直接枚举TTT:

ans=∑T=1n∑d|Tdμ(Td)⌊nT⌋⌊nT⌋" role="presentation">ans=∑T=1n∑d|Tdμ(Td)⌊nT⌋⌊nT⌋ans=∑T=1n∑d|Tdμ(Td)⌊nT⌋⌊nT⌋

ans=\sum_{T=1}^n\sum_{d|T}d\mu(\frac{T}{d})\lfloor\frac{n}{T}\rfloor\lfloor\frac{n}{T}\rfloor

由∑d|Tdμ(Td)⇔φ(T)∑d|Tdμ(Td)⇔φ(T)\sum_{d|T}d\mu(\frac{T}{d})\Leftrightarrow \varphi(T)得:

ans=∑T=1nφ(T)⌊nT⌋⌊nT⌋ans=∑T=1nφ(T)⌊nT⌋⌊nT⌋

ans=\sum_{T=1}^n\varphi(T)\lfloor\frac{n}{T}\rfloor\lfloor\frac{n}{T}\rfloor

那么直接线筛φ(x)φ(x)\varphi(x),求前缀和,乖乖ACAC\mathcal{AC}??

然而并没有那么简单,我们多算了i=ji=ji=j的情况,并且gcd(i,j)gcd(i,j)gcd(i,j)与gcd(j,i)gcd(j,i)gcd(j,i)被重复计算,需要除以222。

代码

记得开long long" role="presentation" style="position: relative;">long longlong long\mathcal{long\ long}。

#include<bits/stdc++.h>
#define R register int
#define ll long long
using namespace std;
const int M=2e6+5,N=2e6;
int p[M],n;
ll phi[M];
bool check[M];
void get()
{R i,j,t;check[1]=phi[1]=1;for(i=2;i<=N;++i){if(!check[i])p[++p[0]]=i,phi[i]=i-1;for(j=1;j<=p[0];++j){t=i*p[j];if(t>N)break;check[t]=1;if(i%p[j]==0){phi[t]=phi[i]*p[j];break;}phi[t]=phi[i]*(p[j]-1);}phi[i]+=phi[i-1];}
}
void in(){get();scanf("%d",&n);}
void ac()
{R l,r;long long ans=0;for(l=1;l<=n;l=r+1)r=n/(n/l),ans+=1ll*(phi[r]-phi[l-1])*(n/l)*(n/l);printf("%lld",(ans-1ll*n*(n+1)/2)/2);
}
int main()
{in();ac();return 0;
}

Luogu1390 公约数的和相关推荐

  1. LeetCode简单题之找出数组的最大公约数

    题目 给你一个整数数组 nums ,返回数组中最大数和最小数的 最大公约数 . 两个数的 最大公约数 是能够被两个数整除的最大正整数. 示例 1: 输入:nums = [2,5,6,9,10] 输出: ...

  2. python最大公约数和最小公倍数的求法_最大公约数和最小公倍数的求法分析

    简介 求最大公约数和最小公倍数可能是编程中最常见的几个基本问题了.因为他们的基本概念基本上很早的时候就知道了,对他们的求法和他们之间的关系都比较有意思. 基本的数学性质 先从最大公约数这一部分开始吧. ...

  3. java编写最大公约数_Java编写最大公约数和最小公倍数

    package javaapplication24; class NegativeIntegerException extends Exception{ String message; public ...

  4. 【蓝桥java】进制与整除之最大公约数 最小公倍数

    补充: (1)欧几里得定理(辗转相除法):A和B的最大公约数 = B和A%B 的最大公约数 (2)将两个数乘起来再除以最大公约数就是最小公倍数 package cn.zzunit.jnvi;/***寻 ...

  5. Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数

    ylbtech-Arithmetic:Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数 1.A,Demo(案例) 输入两个正整数m和n,求其最大公约数和最小 ...

  6. 最大公约数和最小公倍数的欧几里得算法

    最大公约数的算法竟然如此简单,不说了,见代码 #include <stdio.h> int gcd(int a, int b) { if(b== 0) return a; return g ...

  7. 素数、最大公约数、最下公倍数、质因数分解

    2013-08-18 11:20:43 素数.最大公约数.最下公倍数.质因数分解都是与素数相关的,解决了素数的问题,其他的都可以此为基础求解. 小结: 求1到n之间的素数的基本方法是通过遍历2到sqr ...

  8. 用欧几里得算法求最大公约数_欧几里得算法:GCD(最大公约数),用C ++和Java示例解释...

    用欧几里得算法求最大公约数 For this topic you must know about Greatest Common Divisor (GCD) and the MOD operation ...

  9. 【算法总结】数学问题-最大公约数和最小公倍数

    [算法总结]最大公约数和最小公倍数 一.最大公约数(GCD:greatest common divisor) 欧几里得算法: 若 a.b 全为零则它们的最大公约数不存在:若 a.b 其中之一为零,则它 ...

  10. ACMNO.22 C语言-公约公倍2 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 输入 两个数 输出 最大公约数 最小公倍数

    题目描述 写两个函数,分别求两个整数的最大公约数和最小公倍数, 用主函数调用这两个函数,并输出结果两个整数由键盘输入. 输入 两个数 输出 最大公约数 最小公倍数 样例输入 6 15 样例输出 3 3 ...

最新文章

  1. delphi dbgrid 焦点 行号_火箭VS爵士领衔,多场焦点对决!今日NBA全部比赛视频直播预告...
  2. 实时监视同步数据库变更,这个框架真是神器
  3. 关于对Caffe适用场景的思考
  4. leaflet调用mysql_Leaflet地图框架使用手册——L.Path
  5. 【python 11】super()
  6. redistemplate注入为null_Windows DLL 注入技术
  7. eclipse上搭建mybatis
  8. 超越Linux!华为鸿蒙明年将成“第五大操作系统”,网友:何时超过iOS?
  9. CentOS 配置mysql允许远程登录
  10. 中标麒麟linux系统安装打印机_中标麒麟系统安装教程
  11. 安科瑞变电站综合自动化系统在变电站的应用-Susie 周
  12. 更改MyEclipse匹配颜色
  13. 金蝶各版本软件迁移到金蝶K3WISE工具补丁合集
  14. echarts配置项图文介绍——xAxis
  15. 利用机器学习预测外汇汇率
  16. 10篇校招/社招面经请你查收~
  17. Java封装继承多态练习题
  18. lepus mysql 复制监控_lepus 天兔监控Mysql部署
  19. 前端html和css的基本知识
  20. 基于JAVA跨境电商网站计算机毕业设计源码+数据库+lw文档+系统+部署

热门文章

  1. linux crontab怎么启动,【linux之crontab,启动】(示例代码)
  2. java反射 泛型类型_【译】9. Java反射——泛型
  3. 版本 tomcat_Tomcat爆出安全漏洞!Spring Cloud/Boot框架多个版本受影响
  4. 参数估计:矩估计和最大似然估计
  5. POJ 1127_Jack Straws
  6. Oracle ORA-00119和ORA-00132的解决方案
  7. IIS5.1、IIS6.0、IIS7.5中安装配置MVC 3
  8. C# 第三方控件 错误 LC-1
  9. 水晶报表图表出现红叉叉的解决方法
  10. redis简介与常用数据类型介绍