原题解链接:https://ac.nowcoder.com/discuss/149978

首先把因数个数和转化成倍数个数和,即 i=1nni\sum_{i=1}^{n}\left\lfloor\frac{n}{i}\right\rfloor

方法1:

利用 ni\left\lfloor\frac{n}{i}\right\rfloor 只有 O(n)O(\sqrt{n}) 种枚举计算。

方法2:

所求即 x,y1[x×yn]\sum_{x, y \geq 1}[x \times y \leq n]

考虑计算 y>x1[x×yn]\sum_{y>x \geq 1}[x \times y \leq n] ,乘2再加上 x=yx=y 的情况就是答案了。

而这个东西可以枚举 xx 计算.

两个方法时间复杂度都是 O(n)O(\sqrt{n})

#include<bits/stdc++.h>
using namespace std;

typedef long long s64;

int main()
{
	int tt;
	cin>>tt;
	while(tt--)
	{
		int n;
		cin>>n;
		s64 ans=0;
		for(int x=1;x*x<=n;++x)ans+=(n/x-x)*2+1;
		cout<<ans<<endl;
	}
}