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;
}

Longge's problem的更多相关文章

  1. Longge's problem poj2480 欧拉函数,gcd

    Longge's problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6918   Accepted: 2234 ...

  2. POJ2480 Longge's problem

    题意 Language:Default Longge's problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1064 ...

  3. poj 2480 Longge's problem 欧拉函数+素数打表

    Longge's problem   Description Longge is good at mathematics and he likes to think about hard mathem ...

  4. POJ 2480 Longge's problem 欧拉函数—————∑gcd(i, N) 1<=i <=N

    Longge's problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6383   Accepted: 2043 ...

  5. poj2480——Longge's problem(欧拉函数)

    Longge's problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9190   Accepted: 3073 ...

  6. poj 2480 Longge's problem [ 欧拉函数 ]

    传送门 Longge's problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7327   Accepted: 2 ...

  7. Longge's problem(欧拉函数应用)

    Description Longge is good at mathematics and he likes to think about hard mathematical problems whi ...

  8. POJ_2480 Longge's problem【积性函数+欧拉函数的理解与应用】

    题目: Longge is good at mathematics and he likes to think about hard mathematical problems which will ...

  9. 题解报告:poj 2480 Longge's problem(欧拉函数)

    Description Longge is good at mathematics and he likes to think about hard mathematical problems whi ...

随机推荐

  1. kma 2019CSP前刷题记录

    2019/10/25 \([LNOI2014]\ LCA\) \([Luogu\ P2774]\) 方格取数问题 \(Gauss\)消元板 \([JSOI2008]\)球形空间产生器 2019/10/ ...

  2. 牛客多校第九场 E All men are brothers 并查集/组合论

    题意: 一开始有n人互不认识,每回合有两个人认识,认识具有传递性,也就是相互认识的人组成小团体.现在问你每个回合,挑选四个人,这四个人互不认识,有多少种挑选方法. 题解: 认识不认识用并查集维护即可, ...

  3. HDU4578-代码一点都不长的线段树

    (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 题意:传送门  原题目描述在最下面.  4种操作,1:区间加法,2:区间乘法,3:区间的所有数都变成一个数,4:访问区间每个数的p次方 ...

  4. Rootkit之SSDT hook(通过CR0)

    CR0当中有一个写保护位,是保护内存不可写属性的,为了能够写入内核,只能把它的保护给咔嚓掉了,不过--如果做完了手脚但不还原写保护属性的话,极有可能会BOSD. /================== ...

  5. C语言进阶学习第三章

    以下记录动态内存分配: 1.malloc和free malloc和free分别用于执行动态内存分配和释放.这些函数维护一个可用内存池,当一个程序需要一些内存时,调用malloc函数,malloc从内存 ...

  6. NFS服务器简易安装

    1.服务端 创建挂载目录 # mkdir /data/nfs 安装NFS软件 # yum install nfs-utils -y 添加配置信息 # vim /etc/exports /data/nf ...

  7. 2018Github用户kamranahmedse分享的开发路线

    下面四张图是Github用户kamranahmedse分享的,主要是web前端开发.后端开发以及DevOps开发的路线图,涉及的点还是很全面的,如果你对这部分有兴趣,并且希望有所作为,以下这几张路线图 ...

  8. ES6 学习 -- Promise对象

    1.promise含义:可以将promise对象看成是一个容器,它保存着未来才会结束的某个事件(一般是异步操作事件)的结果,各 种异步操作都可以用promise对象来处理promise的特点:(1)p ...

  9. MySQL更新指定分组中最大值记录

    数据表中存储着某个状态字段,当分组中所有数据入库后,需要根据相应的最大值更新状态字段,如表: 现在要将no=11的分组中把最大值记录的status更新为1,可以直接这么写: ; done~

  10. more指令和less指令使用的区别

    more和less都是可以一页一页的翻动 more翻页的时候,显示有百分比在最下一行 less没有 more可以用来查询 空白键 (space):代表向下翻一页:Enter :代表向下翻『一行』:/字 ...