应该是O(n)呀,难道是常数爆炸了?
#include<bits/stdc++.h>
using namespace std;
const int maxn=20000001;
std::bitset<maxn> prime;
int n,d[maxn],lst[maxn],f[maxn];
signed main()
{
ios::sync_with_stdio(0);
cin>>n;
for(int i=1;i<=n;i++) d[i]=1+log10(i)+d[i-1],prime[i]=true;
f[1]=1,prime[1]=false;
for (int i = 2; i <= n; i++) {
if (prime[i]) {
lst[++lst[0]] = i;
f[i]=i-1;
}
for (int j = 1; j <= lst[0]; j++) {
if (i * lst[j] > n) {
break;
}
prime[i * lst[j]] = false;
if (i % lst[j] == 0) {
f[i*lst[j]]=f[i]*lst[j];
break;
}
f[i*lst[j]]=f[i]*f[lst[j]];
}
}
double ans=0;
for(int i=1;i<=n;i++)
{
ans+=f[i]*(d[n/i]+(1+int(log10(i)))*log2(1+int(log10(i))));
}
printf("%.6f",ans);
return 0;
}