题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3881
题意:
问题和ABC猜想无关,定义
rad(n)
表示
n
的因子中最大的无平方因子数,
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
的约数
那么有
h(n)=∑nk=1∑ni=1∑nj=1[(i,j)=1]⋅[ij=k]⋅i=∑ni=1∑nj=1[(i,j)=1]⋅[ij≤n]⋅i
。
所以有
利用 [n=1]=∑d|nμ(d) 得
而当 ij≤n 时, d≤min(i,j)≤n−−√ ,故有
可以发现 j 很容易被消除,
其中 s(n)=∑ni=1i⋅⌊ni⌋=∑ni=1σ(i) 可以 O(n−−√) 计算。
注意到这里复杂度下界已经是 O(n−−√) ,所以枚举 d 即可,不需要根据
设计算 h(n) 的时间复杂度为 T(n) ,则
代码:
#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;
}