hdu Calculation 2(初渉欧拉関数)
867 ワード
http://acm.hdu.edu.cn/showproblem.php?pid=3501
n以下であり、nとは互質でない正の整数の和を求める.
オラ関数は、1〜n−1内のnとの間の相互作用の数の数を解くために使用されます.
拡張子: 1~n-1内とn間の相互質の数の和はeular(n)*n/2である.
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
",ans);
}
return 0;
}