由 [SDOI2012]Longge的问题 探讨欧拉函数和莫比乌斯函数的一些性质和关联

本题题解

题目传送门:https://www.luogu.org/problem/P2303

给定一个整数n,求

i=1ngcd(n,i)

蒟蒻随便yy了一下搞出来个O(n)的算法 这题数据怎么这么水

首先看到gcd我们就下意识的对它反演一波对吧

第一步

i=1ngcd(n,i)=d|nφ(d)nd

这里提供两种化法,得到的结果都是这个。

法一

根据欧拉函数和式

n=d|nφ(d)

暴力推导即可

i=1ngcd(n,i)=i=1nd|gcd(n,i)φ(d)=d|ni=1ndφ(d)=d|nφ(d)nd

法二

根据欧拉函数的定义式

φ(n)=i=1n[gcd(n,i)=1]

PS:φ(n)表示1~n1内与n互质的数,将和式上界提升到n不但不会影响正确性(gcd(n,n)=n1),而且让φ(1)不用特判。

易得

i=1ngcd(n,i)=d|ndi=1n[gcd(n,i)=d]=d|ndi=1nd[gcd(nd,i)=1]=d|ndφ(nd)=d|nφ(d)nd

这一步还是比较简单的。稍有基础的同学大概都会吧

第二步

g(n)=i=1ngcd(n,i)=d|nφ(d)nd

我们希望求g的在n的函数值。容易发现右式是狄利克雷卷积φId,也就是说g也是积性函数。所以考虑质因数分解n,最后用积性累乘出来

g(n)=g(p1c1)g(p2c2)...g(pncn)

则只需求g(pc)(这里省略下标)

pc的因数分别为1pp2,...,pc

所以有

g(pc)=i=0cφ(pi)pcpi=i=0cφ(pi)pci

φ(pc)

考虑先弄出上式中φ(pi)的封闭形式,再带回原式看看

根据欧拉函数通式

φ(n)=ni=1k(11pi)

(这个π指的是分解质因数)

易得

φ(pc)=pc(1p)=pcpc1

注意这个式子需要在c=0时特判,因为φ(1)=11可以视作分解不出任何质因数)

g(pc)

得到了φ(pc),带回之前未推完的g(pc)的式子,得

g(pc)=i=0cφ(pi)pci=pc+i=1c(pipi1)pci=pc+i=1c(pcpc1)=pc+c(pcpc1)=(c+1)pcc pc1

(中途对i=0进行了特殊讨论)(该式同样不适用于c=0的情况)

然后积性合并起来就完了

冷静分析一波时间复杂度。质因数分解消耗O(n)的时间复杂度,分解出不超过O(log2n)pc,每个g(pc)的计算是O(1)的。所以总时间复杂度为O(n)

代码

非常简单的代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
ll p[1005],c[1005],g[1005];ll kN;
void Div(ll n){
kN=0;
for(ll i=2;i*i<=n;i++){
if(n%i==0){
kN++;p[kN]=i;
g[kN]=1;
ll e=0;while(n%i==0) e++,n/=i,g[kN]*=i;
c[kN]=e;
}
}
if(n!=1) kN++,p[kN]=n,c[kN]=1,g[kN]=n;
}
ll N;
int main(){
cin>>N;
Div(N);
ll pdt=1;
for(int i=1;i<=kN;i++) pdt=pdt*((c[i]+1)*g[i]-c[i]*g[i]/p[i]);
cout<<pdt;
return 0;
}

这式子长得跟小粉兔菊苣的题解很像?

更多思考

坐车时无聊在草稿纸上瞎搞出来的

拓展到莫比乌斯函数

第一步化完后,我们得到这样一个函数

g(n)=d|nφ(d)nd

然后我们用质因数分解弄出了一个求它单点函数值的方法

可不可以把它拓展到莫比乌斯函数上呢?

g(n)=d|nμ(d)nd

直接仿照上面化φ的方法来

根据莫比乌斯函数定义,易得

μ(pc)=[c=1]

同样需要特判c=0的情况

带回得

g(pc)=i=0cμ(pi)pci=pc+i=1c[i=1]pci=pcpc1

(该式同样不适用于c=0的情况)

挺简洁的对吧(

小小的总结

总结一下,首先我们发现要求的g(n)=d|nf(d)nd是积性函数,所以考虑分解质因数,简化枚举因数的过程为g(pc)=i=0cf(pi)pci。我们分别根据φμ的特殊性质,化出了它们在pc的函数值,然后代回化简得出g(pc)的封闭形式,最后用积性合并起来,就得到了g(n)

仔细思考一下φμ的特殊性质。

φ(pi)=pipi1,而带回后与pci刚好抵消掉了枚举的变量i,从而得出封闭形式。也就是说,φ可以这么化是因为待求函数g比较特殊,它卷了个Idnd发挥了抵消作用。

μ(pc)=[c=1],只有在c=0c=1时函数非0,而这也就把和式简化为仅将i=0i=1两项相加。可见μ并没有用到nd的特殊性质,对于狄利克雷卷积是通用的,常用于分解质因数后的处理。比如这道题:洛谷P4464 [国家集训队]JZPKIL

莫比乌斯函数与欧拉函数的相互关系

第一步我们在做什么?

i=1ngcd(n,i)=d|nφ(d)nd

那我同样考虑把它变到莫比乌斯函数上。

思考化该式时用到过的欧拉函数和式,联系到莫比乌斯函数的和式

[n=1]=d|nμ(d)

猜想

i=1n[gcd(n,i)=1]=d|nμ(d)nd

证明很容易。

i=1n[gcd(n,i)=1]=i=1nd|gcd(n,i)μ(d)=d|nμ(d)nd

然后你仔细看看左式,这不就是欧拉函数的定义式吗

于是我们找到了一个极其简洁地描述了μφ关联的公式

φ(n)=d|nμ(d)nd

将本式简单变形就得到了一个更常见的表现形式

φ(n)n=d|nμ(d)d

额,不过这式子好像也没啥用,至少我没见过要用这个的题

upd 2019/11/04 用狄利克雷卷积证明

突然发现上式可以用狄利克雷卷积非常容易的证明

Id=φIIdμ=φIμ=φε=φ

2019/09/22

posted @   sun123zxy  阅读(678)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示