因子个数和
令f(i)为i的因子个数,求f(1)+f(2)+…+f(n)的值
首先,我们肯定会想到 O ( n ) O(n) O(n) 的方法,但是这一题的数据证明了这一题应该需要 O ( n ) O(\sqrt{n}) O(n)。我知道我的同桌非常聪明,想到了一个神奇的方法,也就是一起算。所以代码长这样。
#include<bits/stdc++.h>
using namespaced std;
int main()
{
long long n;
cin>>n;
long long ans=0;
for(int i=1;i<=sqrt(n);i++)
{
ans+=((long long)i*i)/i*2+1;
}
cout<<ans<<endl;
return 0;
}
但是我作为蒟蒻,想到了数论分块的模版题,然后写了出来,长这样:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
int solve2(int l,int r)
{
return r-l+1;
}
int solve()
{
int l=1,r=0,res=0;
while(l<=n)
{
r=k/(k/l);
res+=solve2(l,r)*(k/l);
l=r+1;
}
return res;
}
signed main()
{
scanf("%lld",&n);
k=n;
printf("%lld",solve());
}
我认为都还可以,所以都放出来了,大家自己比对。