由 [SDOI2012]Longge的问题 探讨欧拉函数和莫比乌斯函数的一些性质和关联
本题题解
题目传送门:https://www.luogu.org/problem/P2303
给定一个整数,求
蒟蒻随便yy了一下搞出来个的算法 这题数据怎么这么水
首先看到gcd我们就下意识的对它反演一波对吧
第一步
这里提供两种化法,得到的结果都是这个。
法一
根据欧拉函数和式
暴力推导即可
法二
根据欧拉函数的定义式
PS:表示~内与互质的数,将和式上界提升到不但不会影响正确性(),而且让不用特判。
易得
这一步还是比较简单的。稍有基础的同学大概都会吧
第二步
令
我们希望求的在的函数值。容易发现右式是狄利克雷卷积,也就是说也是积性函数。所以考虑质因数分解,最后用积性累乘出来
即
则只需求(这里省略下标)
的因数分别为,,,...,
所以有
求
考虑先弄出上式中的封闭形式,再带回原式看看
根据欧拉函数通式
(这个指的是分解质因数)
易得
注意这个式子需要在时特判,因为(可以视作分解不出任何质因数)
求
得到了,带回之前未推完的的式子,得
(中途对进行了特殊讨论)(该式同样不适用于的情况)
然后积性合并起来就完了
冷静分析一波时间复杂度。质因数分解消耗的时间复杂度,分解出不超过个,每个的计算是的。所以总时间复杂度为
代码
非常简单的代码
#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; }
这式子长得跟小粉兔菊苣的题解很像?
更多思考
坐车时无聊在草稿纸上瞎搞出来的
拓展到莫比乌斯函数
第一步化完后,我们得到这样一个函数
然后我们用质因数分解弄出了一个求它单点函数值的方法
可不可以把它拓展到莫比乌斯函数上呢?
直接仿照上面化的方法来
根据莫比乌斯函数定义,易得
同样需要特判的情况
带回得
(该式同样不适用于的情况)
挺简洁的对吧(
小小的总结
总结一下,首先我们发现要求的是积性函数,所以考虑分解质因数,简化枚举因数的过程为。我们分别根据和的特殊性质,化出了它们在的函数值,然后代回化简得出的封闭形式,最后用积性合并起来,就得到了
仔细思考一下和的特殊性质。
,而带回后与刚好抵消掉了枚举的变量,从而得出封闭形式。也就是说,可以这么化是因为待求函数比较特殊,它卷了个,发挥了抵消作用。
,只有在或时函数非,而这也就把和式简化为仅将和两项相加。可见并没有用到的特殊性质,对于狄利克雷卷积是通用的,常用于分解质因数后的处理。比如这道题:洛谷P4464 [国家集训队]JZPKIL
莫比乌斯函数与欧拉函数的相互关系
第一步我们在做什么?
那我同样考虑把它变到莫比乌斯函数上。
思考化该式时用到过的欧拉函数和式,联系到莫比乌斯函数的和式
猜想
证明很容易。
然后你仔细看看左式,这不就是欧拉函数的定义式吗
于是我们找到了一个极其简洁地描述了和关联的公式
将本式简单变形就得到了一个更常见的表现形式
额,不过这式子好像也没啥用,至少我没见过要用这个的题
upd 2019/11/04 用狄利克雷卷积证明
突然发现上式可以用狄利克雷卷积非常容易的证明
2019/09/22
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现