Description

Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数 \(N\),你需要求出 \(\sum gcd(i, N)(1\le i \le N)\)。

Input

一个整数,为 \(N\)。

Output

一个整数,为所求的答案。

Sample Input

6

Sample Output

15

HINT

\(0<N\le 2^{32}\)

Solution

\[\begin{eqnarray}
\sum_{i = 1}^{n}\gcd(i,n)&=&\sum_{d\mid n}d\sum_{i=1}^{n}[\gcd(i,n)=d]\\
&=&\sum_{d|n}d\sum_{i=1}^{\frac{n}{d}}[\gcd(i,\frac{n}{d})=1]\\
&=&\sum_{d\mid n}d\times\varphi\left(\frac{n}{d}\right)
\end{eqnarray}
\]

设 \(p\) 为质数,有 \(\varphi(p^k)=p^k-\dfrac{p^k}{p}=p^k(1-\dfrac{1}{p})\),因此

\[\begin{eqnarray}
\varphi(n)&=&\varphi(p_1^{k_1})\varphi(p_2^{k_2})\varphi(p_3^{k_3})\cdots\\
&=&p_1^{k_1}(1-\frac{1}{p_1})p_2^{k_2}(1-\frac{1}{p_2})p_3^{k_3}(1-\frac{1}{p_3})\cdots\\
&=&n(1-\frac{1}{p_1})(1-\frac{1}{p_2})(1-\frac{1}{p_3})\cdots
\end{eqnarray}
\]

因此就有了 \(O(\sqrt n)\) 求 \(\varphi(n)\) 的做法。

〖推论〗当 \(n\) 为奇数时,\(\varphi(n)=\varphi(2n)\)。

Code

#include <cstdio>
#include <cmath> typedef long long LL;
const int N = 65540;
int phi[N], p[N], tot, np[N], m; LL n, ans; void euler(int n) {
phi[1] = 1;
for (int i = 2; i <= n; ++i) {
if (!np[i]) p[++tot] = i, phi[i] = i - 1;
for (int j = 1; j <= tot && i * p[j] <= n; ++j) {
np[i * p[j]] = 1;
if (i % p[j] == 0) { phi[i * p[j]] = phi[i] * p[j]; break; }
phi[i * p[j]] = phi[i] * (p[j] - 1);
}
}
}
LL getphi(LL n) {
int m = sqrt(n); LL res = n;
for (int i = 1; i <= tot && p[i] <= m; ++i)
if (n % p[i] == 0) {
res -= res / p[i];
while (n % p[i] == 0) n /= p[i];
}
if (n > 1) res -= res / n;
return res;
}
int main() {
scanf("%lld", &n), m = sqrt(n), euler(m);
for (int i = 1; i <= m; ++i)
if (n % i == 0) ans += i * getphi(n / i) + (n / i) * phi[i];
if (1LL * m * m == n) ans -= 1LL * m * phi[m];
printf("%lld\n", ans);
return 0;
}

最新文章

  1. 星外Xday提权
  2. 关于&lt;textArea&gt;控件下显示不出其它控件
  3. jQuery easyui combobox获取值|easyui-combobox获取多个值
  4. HtmlAgilityPack组件
  5. NET中验证控件表达式汇总
  6. Animation在每一帧中的执行顺序测试
  7. 剑指Offer46 求1+2+...+n
  8. python(3)-内置函数
  9. Swift小功能点积累
  10. 通过java类文件识别JDK编译版本
  11. 网易云课堂_程序设计入门-C语言_第四周:循环控制_2念整数
  12. commons - lang(1) StringUtils
  13. hadoop上的C++程序开发
  14. PHP获取新插入的主键id
  15. vue插槽,也就是子页面、父页面相互传值的另一写法
  16. mybatis插入数据后返回对象id
  17. 剑指offer例题——旋转数组的最小数字
  18. java包 命名规范 [转]
  19. UIWebView如何加载本地图片
  20. poj1258 Agri-Net(Prime || Kruskal)

热门文章

  1. Service启动,绑定与交互
  2. Java之所有输入流输出流的分类
  3. Item 25: 对右值引用使用std::move,对universal引用则使用std::forward
  4. 【小技巧】css文字两端对齐
  5. 爱奇艺2017秋招笔试(C++智能设备方向)
  6. Python-类的特性(property)
  7. scrapy之环境安装
  8. shell脚本--eval执行shell命令
  9. java list 去重
  10. Web系统大规模并发——秒杀与抢购 秒杀系统优化与预防措施