题目
题目链接:https://gmoj.net/senior/#main/show/1164
给出一个正整数 (n(1leq n< 2^31)),你的任务是求出 (1~n) 中与 (n) 互质的数的总和。
思路
如果 (x) 与 (n) 互质,那么显然 (n-x) 也和 (n) 互质。而这两项加起来恰好等于 (n)。
所以答案就是 (2n imes varphi(n))。
代码
#include <bits/stdc++.h>
using namespace std;
int n,m,phi;
int main()
{
scanf("%d",&n);
if (n==1) return printf("1"),0;
phi=m=n;
for (int i=2;1LL*i*i<=n;i++)
if (n%i==0)
{
phi=phi/i*(i-1);
while (n%i==0) n/=i;
}
if (n>1) phi=phi/n*(n-1);
printf("%lld",1LL*phi*m/2LL);
return 0;
}