hdu Calculation 2(初涉欧拉函数)

http://acm.hdu.edu.cn/showproblem.php?pid=3501

求小于n并且与n不互质的正整数之和。


欧拉函数用于求解1~n-1内与n互质的数的个数。

扩展: 1~n-1内与n互质的数之和为 eular(n)*n/2.

#include <stdio.h>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#define LL long long
#define _LL __int64
using namespace std;

const int mod = 1000000007;

int eular(_LL n)
{
	int ret = n;

	for(int i = 2; i*i <= n; i++)
	{
		if(n%i == 0)
		{
			ret -= ret/i;
			while(n%i == 0)
				n /= i;
		}
	}

	if(n > 1)
		ret -= ret/n;
	return ret;
}

int main()
{
	_LL n;
	while(~scanf("%I64d",&n) && n)
	{
		LL ans = n*(n+1)/2-n;
		ans -= eular(n)*n/2;
		ans %= mod;
		printf("%I64d\n",ans);

	}
	return 0;
}


你可能感兴趣的:(数论)