Longge's problem

求\(\sum_{i=1}^ngcd(i,n)\),\(n< 2^{31}\)。

理解1:

注意式子的实际意义,显然答案只可能在n的约数中,而现在问题变成了每个约数出现了几次,而一个约数d要出现的次数,自然需要这个数有约数d,其他的约数与之互斥,于是考虑欧拉函数,故我们有

\[ans=\sum_{d|n}\varphi(n/d)d
\]

以此枚举n的约数爆算即可,时间复杂度不难得知为\(O(\sigma(n)\sqrt{n})\)。

理解2:

约数计数问题,考虑反演,于是有

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

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

\[F(d)=[n/d](d|n)
\]

由Mobius反演定理,带入原式我们有

\[ans==\sum_{d=1}d\sum_{d|x,x|n}[n/x]\mu(x/d)=
\]

\[\sum_{x|n}[n/x]\sum_{d|x}d\mu(x/d)=\sum_{x|n}[n/x]\varphi(x)
\]

同理解1做法即可。

于是我们可以小结一下,同排列组合一样,约数计数问题,也有它的实际意义的理解,两者侧重点不同,一个侧重思维,一个侧重代数变换,但是殊途同归,而且不难得知最后的答案其实就是\(\varphi *id\),我们可以使用杜教筛对之优化,数据范围可以出到\(10^{11}\),但无论如何,重点都在于对于约数的巧妙的理解。

参考代码:

#include <iostream>
#include <cstdio>
#define il inline
#define ri register
#define ll long long
using namespace std;
il ll Phi(ll);
int main(){
ll ans,n,i;
while(scanf("%lld",&n)!=EOF){
for(ans&=0,i=1;i*i<n;++i)
if(!(n%i)){
ans+=(n/i)*Phi(i);
ans+=(i)*Phi(n/i);
}
if(i*i==n)ans+=i*Phi(i);
printf("%lld\n",ans);
}
return 0;
}
il ll Phi(ll n){
ri ll i,ans(n);
for(i=2;i<=n/i;++i)
if(!(n%i)){
(ans/=i)*=(i-1);
while(!(n%i))n/=i;
}if(n>1)(ans/=n)*=(n-1);
return ans;
}

最新文章

  1. vtkTransform实例 1
  2. Js获取图片原始宽高
  3. git之install
  4. Kafka学习笔记(二):Partition分发策略
  5. MySQL数据类型总结
  6. V2EX社区
  7. oracle中创建表时添加注释
  8. &lt;iOS&gt;UIImage变为NSData并进行压缩
  9. 如何从MVP模式进阶到Clean模式
  10. 12.21-Android ServerSocket
  11. git报错:&#39;fatal:remote origin already exists
  12. 使用gulp打包普通项目
  13. mysql事件调用存储过程总结
  14. altera DDR2 IP核之仿真
  15. jemter聚合报告参数指标
  16. mysql字符集问题汇总
  17. WireShark抓包工具使用
  18. Oracle掌管权限和角色
  19. 信用卡:银联,VISA,MasterCard
  20. Unity5.5+easytouch5双摇杆控制角色移动

热门文章

  1. https://segmentfault.com 一个学习网站
  2. Ngui之UI框架的层级处理
  3. 剑指offer——32从上到下打印二叉树
  4. 控制音量大小widget
  5. Two-phase Termination 把玩具收拾好再去睡觉。
  6. dubbo jar 配置文件
  7. Windows服务调试状态下用Console启动
  8. 【笔记篇】单调队列优化dp学习笔记&amp;&amp;luogu2569_bzoj1855股票交♂易
  9. 数据库MySQL--子查询
  10. Java怎样实现解析身份证号