【GMOJ1164】求和
题目
题目链接:https://gmoj.net/senior/#main/show/1164
给出一个正整数 \(n(1\leq n< 2^31)\),你的任务是求出 \(1~n\) 中与 \(n\) 互质的数的总和。
思路
如果 \(x\) 与 \(n\) 互质,那么显然 \(n-x\) 也和 \(n\) 互质。而这两项加起来恰好等于 \(n\)。
所以答案就是 \(2n\times \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;
}