τ(n)
表示n的因子个数
可在
O(nlogn)
时间内求出前n项或在
O(sqrt(n))
时间内求第n项
for(int i=1;i<=n;i++)
for(int j=1;i*j<=n;j++)
sigma[i*j]+=1;
感觉取整函数貌似与 τ(n) 有不解之缘
下面的东西的具体证明我还不会,等会了再来更新
给大家推荐一个网站,你给他一个数列他能告诉你这是什么数列,还有这个数列的求法什么的
ceil
f(n)=∑i=1n⌈ni⌉
f(n)=1+f(n−1)+τ(n−1)
floor
g(n)=∑i=1n⌊ni⌋=∑i=1nτ(i)=f(n)+τ(n)−n
一种求
f(n),g(n)
的前n项的方法是枚举n,然后利用分段优化来求每一项
代码如下:
两个代码类似
for(int i=1;i<=n;i++)
for(int j=1,nex;j<=i;j=nex+1)
{
nex = i/(i/j);
f[i] +=(nex-j+1)*(i/j);
}
for(int i=1;i<=n;i++)
for(int j=i,nex;j>=1;j=nex-1)
{
tmp = i/j;
if(i%j) tmp++;
nex = i/tmp;
if(i%tmp) nex++;
g[i] +=(j-nex+1)*tmp;
}
上面的两个代码复杂度是
O(nn√)的
不过利用上述的递推式加上
τ(n)
的求法可以在
O(nlogn)
得到
f(n)、g(n)
的前n项