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;
}