题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3881
题意:
问题和ABC猜想无关,定义 rad(n) 表示 n 的因子中最大的无平方因子数, φ(n) 表示不大于 n 且与 n 互质的正整数个数,令 f(n)=rad(n)⋅φ(nrad(n)),g(n)=∑d|nf(d),h(n)=∑ni=1g(i) ,给定正整数 N ,求 h(N)mod(109+9) 的值。
n≤1012 。
题解:
若 n=∏ti=1pkii ,则 rad(n)=∏ti=1pi ,是一个积性函数。
而对于 (n,m)=1 ,显然有 (nrad(n),mrad(m))=1 ,则 f(n⋅m)=rad(n⋅m)⋅φ(n⋅mrad(n⋅m))=rad(n)⋅rad(m)⋅φ(nrad(n))⋅φ(mrad(m))=f(n)⋅f(m) ,也是一个积性函数。
那么 g(n)=∑d|nf(d)=∏ti=1∑kij=0f(pji)=∏ti=1(1+pi⋅∑kij=1φ(pj−1i))=∏ti=1(pkii+1) 。
仔细看 g(n) 的式子,相当于选出了一些 n 的约数 d 进行求和,而且每个质因数 pi 要么不选,要么选 pkii ,这样的 d 是满足 (d,nd)=1 的,因此 g(n)=∑d|n[(d,nd)=1]⋅d=∑ni=1∑nj=1[(i,j)=1]⋅[ij=n]⋅i 。
那么有 h(n)=∑nk=1∑ni=1∑nj=1[(i,j)=1]⋅[ij=k]⋅i=∑ni=1∑nj=1[(i,j)=1]⋅[ij≤n]⋅i 。
所以有
代码:
#include <cmath>
#include <cstdio>
typedef long long LL;
const int maxn = 1000001, mod = 1000000009, inv2 = 500000005;
int f[maxn];
int s(LL n)
{
int res = 0;
for(LL i = 1, j; i <= n; i = j + 1)
{
j = n / (n / i);
res = (res + n / i % mod * ((j - i + 1) % mod) % mod * ((i + j) % mod)) % mod;
}
res = (LL)res * inv2 % mod;
return res;
}
int main()
{
f[1] = 1;
for(int i = 1; i < maxn; ++i)
{
for(int j = i + i; j < maxn; j += i)
f[j] -= f[i];
f[i] *= i;
}
for(LL n; scanf("%lld", &n) == 1; )
{
int ans = 0, lim = (int)ceil(sqrt(n));
for(int i = 1; i <= lim; ++i)
if(f[i])
ans = (ans + (LL)f[i] * s(n / i / i)) % mod;
if(ans < 0)
ans += mod;
printf("%d\n", ans);
}
return 0;
}