【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;
}
posted @ 2020-10-15 11:49  stoorz  阅读(100)  评论(0编辑  收藏  举报