解题思路
遍历1-n,其中约数为i的数的个数是
n
/
i
n/i
n/i
所以可以推出
G
(
n
)
=
∑
i
=
1
n
[
n
/
i
]
∗
i
G(n)=\sum_{i=1}^n [n/i]*i
G(n)=i=1∑n[n/i]∗i
如果暴力时间复杂度为
O
(
n
)
O(n)
O(n),可以采取整除分块做法,时间复杂度为
O
(
n
)
O(\sqrt[]{n})
O(n)
整除分块板子
for (register int i=1; i <= n; i = j + 1){
j = n / ( n / i ),
ans += (j - i + 1) * (n / i);
}
题解代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll G(ll n)
{
ll ans=0;
for(ll i=1,j;i<=n;i=j+1)
{
j=n/(n/i);
ll a=(j-i+1)*i+(j-i+1)*(j-i)/2;
ans+=a*(n/i);
}
return ans;
}
int main()
{
int n;
cin>>n;
cout<<G(G(n))<<"\n";
}