题目传送门
题意: 定义
f
(
i
)
f(i)
f(i)是数字
i
i
i的数位和,
f
(
123
)
=
1
+
2
+
3
f(123)=1+2+3
f(123)=1+2+3。
求
∑
i
=
1
n
∑
j
=
1
i
[
g
c
d
(
i
,
j
)
=
=
1
]
f
(
j
)
\sum \limits_{i=1}^{n} \sum \limits_{j=1}^{i} [gcd(i,j)==1]f(j)
i=1∑nj=1∑i[gcd(i,j)==1]f(j) 。
思路: 这个式子一眼就是莫比乌斯反演,但是队友容斥就过了。
推式子过程:
∑ i = 1 n ∑ j = 1 i [ g c d ( i , j ) = = 1 ] f ( j ) = ∑ j = 1 n ∑ i = j n f ( j ) ∑ d ∣ ( i , j ) μ ( d ) = ∑ d = 1 n μ ( d ) ∑ j = 1 ⌊ n d ⌋ f ( j ∗ d ) ∑ i = j ⌊ n d ⌋ 1 = ∑ d = 1 n μ ( d ) ∑ j = 1 ⌊ n d ⌋ f ( j ∗ d ) ( ⌊ n d ⌋ − j + 1 ) \begin{aligned}\\ &\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{i}[gcd(i,j)==1]f(j)\\= &\sum\limits_{j=1}^{n} \sum\limits_{i=j}^{n}f(j)\sum\limits_{d|(i,j)}\mu(d)\\= &\sum\limits_{d=1}^{n}\mu(d)\sum\limits_{j=1}^{\lfloor \frac{n}{d} \rfloor}f(j*d)\sum\limits_{i=j}^{\lfloor \frac{n}{d} \rfloor}1\\= &\sum\limits_{d=1}^{n}\mu(d)\sum\limits_{j=1}^{\lfloor \frac{n}{d} \rfloor}f(j*d)(\lfloor\cfrac{n}{d}\rfloor-j+1) \end{aligned} ===i=1∑nj=1∑i[gcd(i,j)==1]f(j)j=1∑ni=j∑nf(j)d∣(i,j)∑μ(d)d=1∑nμ(d)j=1∑⌊dn⌋f(j∗d)i=j∑⌊dn⌋1d=1∑nμ(d)j=1∑⌊dn⌋f(j∗d)(⌊dn⌋−j+1)
然后筛出莫比乌斯函数,就可以求解了。时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
代码:
// Author : ACfunhsl
// Time : 2021/5/15 22:29:33
#define int long long
const int N = 1e5+50;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
bool ok[N];
int p[N],mu[N],cnt=0;
void init()
{
mu[1] = 1;
for(int i=2;i<N;i++)
{
if(!ok[i])
{
p[++cnt] = i;
mu[i] = -1;
}
for(int j=1;j<=cnt&&p[j]*i<N;j++)
{
ok[i*p[j]] = 1;
if(i%p[j]==0)
{
mu[i*p[j]] = 0;
break;
}
else mu[i*p[j]] = -mu[i];
}
}
}
int f(int x)
{
int tot = 0;
while(x) tot+=x%10,x/=10;
return tot;
}
signed main()
{
int n;
cin>>n;
init();
int res = 0;
for(int d=1;d<=n;d++)
{
for(int j=1;j<=n/d;j++)
{
res += mu[d]*f(j*d)*(n/d-j+1);
}
}
cout<<res<<endl;
return 0;
}