当前位置: 首页 > 编程日记 > 正文

【Project Euler】530 GCD of Divisors 莫比乌斯反演

【题目】GCD of Divisors

【题意】给定f(n)=Σd|n gcd(d,n/d)的前缀和F(n),n=10^15。

【算法】莫比乌斯反演

【题解】参考:任之洲数论函数.pdf

这个范围显然杜教筛也是做不了的,而且考虑直接化简f(n)也遇到了困难,所以考虑将前缀和的Σ一起化简

$$F(n)=\sum_{i=1}^{n}\sum_{d|i}(d,\frac{i}{d})$$

这一步很常见的是第一重改为枚举倍数,但这样化简后面就推不下去了。

这道题必须最后转成$\sigma_0(n)$才能解出来。

所以直接枚举gcd值

$$F(n)=\sum_{d=1}^{n}d\sum_{i=1}^{n}\sum_{g|i}[(g,\frac{i}{g})=d]$$

这里gcd(g,i/g)=d,说明i中必须至少包含2个d,那么令i=i/d^2,g即可任取i的因子,最终的g和i/g各乘d即可,所以可以进行如下化简。(关键①)

$$F(n)=\sum_{d=1}^{n}d\sum_{i=1}^{\frac{n}{d^2}}\sum_{g|i}[(g,\frac{i}{g})=1]$$

转化成φ希望不大,所以直接莫比乌斯反演。

$$F(n)=\sum_{d=1}^{n}d\sum_{i=1}^{\frac{n}{d^2}}\sum_{g|i}\sum_{d'|g \cap d'|\frac{i}{g}}\mu(d')$$

$$F(n)=\sum_{d=1}^{n}\sum_{d'=1}^{n}d*\mu(d')\sum_{i=1}^{\frac{n}{d^2}}\sum_{g|i}[d'|g \cap d'|\frac{i}{g}]$$

这里和上面一样,都是要求d'|g&&d'|i/g,因此从i中提取2个d',即令i=i/d'^2。

$$F(n)=\sum_{d=1}^{n}\sum_{d'=1}^{n}d*\mu(d')\sum_{i=1}^{\frac{n}{(dd')^2}}\sum_{g|i}1$$

会发现后面是约数个数。(关键②)

$$F(n)=\sum_{d=1}^{n}\sum_{d'=1}^{n}d*\mu(d')\sum_{i=1}^{\frac{n}{(dd')^2}}\sigma_0(i)$$

前面部分发现d*μ(d')好像可以卷积到φ,考虑合并dd‘来构造卷积,令d=dd'。(关键③)

$$F(n)=\sum_{d=1}^{\sqrt{n}}\sum_{g|d}g*\mu(\frac{n}{g})\sum_{i=1}^{\frac{n}{(dd')^2}}\sigma_0(i)$$

这里d只枚举到√n,因为d>√n时后面的Σ=0,没有贡献。因此可以缩小实际枚举范围。(关键④)

然后根据狄利克雷卷积μ*id=φ可以化简

$$F(n)=\sum_{d=1}^{\sqrt{n}}\varphi(d)\sum_{i=1}^{\frac{n}{(dd')^2}}\sigma_0(i)$$

大功告成!

其中,约数个数的前缀和可以进行分块取值优化,如下

$$\sum_{i=1}^{n}\sigma_0(i)=\sum_{i=1}^{n}\sum_{d|i}1=\sum_{i=1}^{n}\sum_{j=1}^{\frac{n}{i}}1$$

$$\sum_{i=1}^{n}\sigma_0(i)=\sum_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor$$

然后线性筛φ的过程中求解即可。

复杂度分析:

$$\sum_{i=1}^{\sqrt{n}}O(\sqrt{\frac{n}{i^2}})=\sum_{i=1}^{\sqrt{n}}O(\frac{\sqrt{n}}{i})=O(\sqrt{n} ln \sqrt{n})$$

倒数第二步将√n提到最外面,Σ内就是调和数列,和近似为ln n。

#include<cstdio>
#include<cmath>
#define int long long
const int maxn=32000000;
int phi[maxn],n,prime[maxn],tot;
int solve(int n){int pos,sum=0;for(int i=1;i<=n;i=pos+1){pos=n/(n/i);sum+=(pos-i+1)*(n/i);}return sum;
}
#undef int
int main(){
#define int long longscanf("%lld",&n);int ans=1*solve(n),N=(int)sqrt(n)+1;phi[1]=1;//1for(int i=2;i<=N;i++){if(!phi[i])phi[prime[++tot]=i]=i-1;for(int j=1;j<=tot&&i*prime[j]<=N;j++){if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}phi[i*prime[j]]=phi[i]*(prime[j]-1);}ans+=phi[i]*solve(n/(i*i));}printf("%lld",ans);return 0;
}
View Code

转载于:https://www.cnblogs.com/onioncyc/p/8488255.html

相关文章:

php mysql 星级评分_jQuery+PHP实现星级评分

本例实现的效果&#xff1a;过渡动画显示评分操作。及时更新平均得分和用户所评的分数。后台限制用户重复评分操作&#xff0c;并在前端及时显示。XHTMLHTML结构分为用于显示灰星星div#big_rate、亮星星div#big_rate_up、分数span#s及span#g和提示信息div#my_rate。CSS.rate{wi…

Xt800、DEFY自带号码归属地更新包,更新至2013.4【数据总数278360条】

总结了http://bbs.gfan.com/forum.php?modviewthread&tid5603346&extrapage%3D1&page1和http://bbs.mfunz.com/thread-706813-1-1.html&#xff0c;经测试在我的XT800上可用&#xff0c;可以把其他的第三方来电软件通通删掉了。 特点&#xff1a;能够显示运营商&a…

中国电子学会图形化四级编程题:程序优化

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

当代艺术遇上虚拟现实:幻境视界打造基业VR美术馆

VR展览也许并不少&#xff0c;但专业的艺术展却难得一见。幻境世界周志强希望能借助VR技术&#xff0c;实现“一地办展、全球同展、永不闭馆”&#xff0c;更好地传播当代艺术。 从米开朗琪罗到库尔贝&#xff0c;再到雷诺阿&#xff0c;大师们不断找到新的艺术语言来阐释人体…

python二叉搜索树建立_700. 二叉搜索树的搜索(Python)

题目难度&#xff1a;★☆☆☆☆类型&#xff1a;二叉树给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 NULL。例如&#xff0c;给定二叉搜索树:4/ \2 7/ \1 3和值: 2你应该返回…

CF484E Sign on Fence

题意 给定一个长度为n的数列&#xff0c;有m次询问&#xff0c;询问形如l r k 要你在区间[l,r]内选一个长度为k的区间&#xff0c;求区间最小数的最大值 Sol 二分答案 怎么判定&#xff0c;每种数字开一棵线段树 某个位置上的数大于等于它为1 那么就是求区间最大的1的序列长度大…

【组队学习】【30期】吃瓜教程——西瓜书+南瓜书

吃瓜教程——西瓜书南瓜书 航路开辟者&#xff1a;谢文睿、秦州领航员&#xff1a;邱振波航海士&#xff1a;谢文睿、秦州 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/pumpkin-bookB 站视频&#xff1a;https://www.bilibili.com/video/BV1Mh411e7VU内…

如何破解压缩文件密码-省时省力的方法

压缩文件破解工具下载地址&#xff1a;http://www.cnblogs.com/spring_wang/archive/2013/06/14/3135163.html 应该很多人都碰到过RAR加密、解密的问题吧。简单给大家介绍下如何用工具来破解RAR密码&#xff01;我们所利用的工具&#xff0c;就是“ARPR”、相信有些人肯定知道。…

学完javase和mysql_Java基础学完接下来应该学什么呢?

谢谢邀请&#xff01;Java基础部分涵盖了类、对象、属性和方法四大概念&#xff0c;以及封装、继承、多态的理解及使用。Java基础部分是Java学习过程中相对来说比较难的部分&#xff0c;Java语言属于开头难&#xff0c;之后越学越简单的语言。基础部分要清晰Java面向对象的开发…

Linux文件分割与合并:splitcat(转载)

转自&#xff1a;http://os.51cto.com/art/201104/255359.htm Linux下文件分割可以通过split命令来实现&#xff0c;而用cat进行文件合并。而分割可以指定按行数分割和安大小分割两种模式。Linux下文件合并可以通过cat命令来实现&#xff0c;非常简单。 在Linux下用split进行文…

【组队学习】【30期】李宏毅机器学习(含深度学习)

李宏毅机器学习&#xff08;含深度学习&#xff09; 航路开辟者&#xff1a;王茂霖、陈安东&#xff0c;刘峥嵘&#xff0c;李玲领航员&#xff1a;初晓宇航海士&#xff1a;王茂霖 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/leeml-notes开源内容&am…

mac下用Dosbox搭建dos下的汇编环境

安装Dosbox&#xff0c;下载地址 pan.baidu.com/s/1qZfgGc0 安装汇编编译器,下载masm pan.baidu.com/s/1c4k5fCc&#xff0c;在个人目录下新建 ~/Dosbox目录&#xff0c;把masm拷贝到Dosbox目录中 设置Dosbox autoexec, 编辑&#xff5e;/Library/Preferences/DOSBox\ 0.74\ …

java线程安全的set_Java并发编程之set集合的线程安全类你知道吗

Java并发编程之-set集合的线程安全类Java中set集合怎么保证线程安全&#xff0c;这种方式你知道吗&#xff1f;在Java中set集合是本篇是《凯哥(凯哥并发编程学习》系列之《并发集合系列》教程的第二篇&#xff1a;本文主要内容&#xff1a;Set集合子类底层分别是什么&#xff1…

亮剑.NET的系列文章之.NET实现三层架构(三)

最近一直在学习三层架构&#xff0c;前些天同样也写了一篇同样的博客&#xff0c;今天主要是通过一个登录的实例给大家讲解每部分的作用和相应代码的实现。先将实现三层架构的UML图给大家&#xff0c;帮助大家更好的理解三层。&#xff11;. UI作用 (1) 向用户展示特定业务数据…

【组队学习】【30期】6. 树模型与集成学习

树模型与集成学习 航路开辟者&#xff1a;耿远昊领航员&#xff1a;姜萌航海士&#xff1a;耿远昊 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/machine-learning-toy-code内容属性&#xff1a;打磨课程内容说明&#xff1a;本课程将对机器学习中的集成…

mysql整理碎片和显示语句错误

2019独角兽企业重金招聘Python工程师标准>>> &#xff11;、myisam存储引擎清理碎片方法 OPTIMIZE TABLE table_name &#xff12;、innodb存储引擎清理碎片方法 ALTER TABLE tablename ENGINEInnoDB &#xff13;、查看表碎片的方法 select ROW_FORMAT,TABLE_ROWS…

java 查询 代码_java使用es查询的示例代码

众所周知&#xff0c;elasticsearch简称es,它是基于基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索…

【转】解密“设计模式”

有些人问我&#xff0c;你说学习操作系统的最好办法是学习程序设计。那我们是不是应该学习一些“设计模式”&#xff08;design patterns&#xff09;。这是一个我很早就有定论&#xff0c;而且经过实践检验的问题&#xff0c;所以想在这里做一个总结。 总的来说&#xff0c;如…

Qt Installer Framework实战

Qt Installer Framework是Qt发布的安装程序支持框架&#xff0c;只需要简单的配置就可以生成安装文件&#xff0c;同时可以通过javascript脚本来定制安装过程。 目录结构 config packages data meta 配置文件 config/config.xml packages/[product]/meta/package.xml packages/…

【NCEPU】徐韬:街景字符编码识别比赛

徐韬是华北电力大学数理系大四的学生&#xff0c;Datawhale成员/Dreamtech成员&#xff0c;参加了多期Datawhale的组队学习&#xff0c;也在天池/CCF/讯飞等比赛中取得了不错的成绩&#xff0c;现保送大连理工大学深造。 这篇图文是他在线下组队学习时&#xff0c;为大家分享自…

java 程序启动界面_程序启动界面java代码

最近写了个程序启动界面&#xff0c;分享一下import javax.swing.*;import java.awt.*;import java.net.*;//Download by http://www.codefans.net//程序启动界面/*dkplus专业搜集和编写实用电脑软件教程&#xff0c;*搜集各种软件资源和计算机周边&#xff0c;独立制作视频和p…

中国电子学会图形化四级编程题:食堂取餐

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

获取app传入的json值处理

$getDatas $_POST; if(empty($getDatas)) $getDatas file_get_contents("php://input"); $getDatas json_decode($getDatas,true); 转载于:https://www.cnblogs.com/wjw-/p/8496855.html

java虚拟机栈帧_Java虚拟机,运行时栈帧结构

业余生活要有意义&#xff0c;不要越轨。——华盛顿引导语“虚拟机”是一个相对于“物理机”的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的&#xff0c;而虚拟机的执行引擎则是由软件…

深入浅出Pytorch:01 课程大纲与PyTorch简介

深入浅出Pytorch 01 课程大纲与PyTorch简介 内容属性&#xff1a;深度学习&#xff08;实践&#xff09;专题航路开辟者&#xff1a;李嘉骐、牛志康、刘洋、陈安东领航员&#xff1a;叶志雄航海士&#xff1a;李嘉骐、牛志康、刘洋、陈安东开源内容&#xff1a;https://githu…

用C写有面向对象特点的程序

比如在一个项目中&#xff0c;有大量的数据结构&#xff0c;他们都是双向链表&#xff0c;但又想共用一套对链表的操作算法&#xff0c;这怎么做到呢&#xff0c;C中又没有C中的继承&#xff0c;不然我可以继承一父&#xff08;类中只有两个指针&#xff0c;一个向前一个向后&a…

[置顶] 单键模式的C++描述

设计模式-单键(Signelton)&#xff1a;其实单键的设计模式说来很简单&#xff0c;说的直白一点就是程序运行过程中保证只有一个实例在运行而已。在软件系统中&#xff0c;经常有这样一些特殊的类&#xff0c;必须保证它们在系统中只存在一个实例&#xff0c;才能确保它们的逻辑…

下java7 64有什么用_Win 7 64位系统安装java 8,看完就明白了

在 Windows 7 的 64 位系统中安装 jdk 8工具/材料Windows 7 64 位系统JDK 8 64位版本方法/步骤1 下载JDK 8安装文件011.1 访问JDK下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html点击 JDK Download 按钮&#xff0c;进入JDK下载页。021.2 下载JDK…

微软BI 之SSAS 系列 - 在 SQL Server 2012 下查看 SSAS 分析服务的模型以及几个模型的简单介绍...

在SSDT中部署一个 SSAS 项目到本地服务器上出现错误。 You cannot deploy the model because the localhost deployment server is not running in multidimensional mode。 错误原因是因为我在本地安装 SQL Server 2012 的时候只选择安装了 Tabular Mode&#xff0c;而这个Dem…

java遍历的优化

说明&#xff1a;这是在面试中面试官出的题。虽然是常见的优化问题&#xff0c;但这种经验的确很有用。感慨之余&#xff0c;分享出来&#xff0c;以此共勉。 场景&#xff1a;现有List<PersonA>,List<PersonB>,PersonA 的属性是 String类型的身份证号&#xff0c;…