hdu 3501
题目大意:求小于等于n的与n互素的正数和,结果取模
1e9+7
;
自己想得比较chun。。。素数分解n,和减去枚举所有不与n互素的数的和;网上看题解发现自己弱爆了。。。
思路: 设 共有
m
个与
设
ans=∑i=0m−1ai
…(1) ,
gcd(ai,n)=1
&&
ai<n
;
可知
gcd(ai,n−ai)=1
;
则
ans=∑i=0m−1(n−ai)
…(2) ,
gcd(ai,n−ai)=1
&&
n−ai<n
;
(1) + (2) 得
2∗ans=n∗m
, 即
ans=n∗φ(n)2
;
#include <iostream>
#include <cstdio>
#define MOD 1000000007
#define LL long long
using namespace std;
LL get_Euler(LL n)
{
LL tmp = n, ans = n;
for (LL i = 2; i * i <= tmp; i++)
{
if (tmp % i == 0)
{
ans = ans / i * (i - 1);
while (tmp % i == 0)
{
tmp /= i;
}
}
}
if (tmp > 1)
{
ans = ans / tmp * (tmp - 1);
}
return ans;
}
int main()
{
LL n;
while (~scanf("%lld", &n) && n)
{
LL ans = (get_Euler(n) * n / 2) % MOD;
ans = ((((n - 1) * n) / 2) % MOD - ans) % MOD;
while(ans < 0)
{
ans += MOD;
}
printf("%lld\n", ans);
}
}