怎么计算sum{ [n/i] }?(1<=i<=n)(n<=2147483647)
n太大,硬算肯定不行,我们先观察一个例子,看能否得出一些结论。
当n=20时,和式展开为
20+10+6+5+4+3+2+2+2+2+1+1+1+1+1+1+1+1+1+1
注意到后面相同的数太多,不妨化简下:
20+10+6+5+1*(20-10)+2*(10-6)+3*(6-5)+4*(5-4)
=(20+10+6+5)+(20+10+6+5)-4*4
=2(20+10+6+5)-4*4
也许,我们可以
#include<cstdio>
#include<cmath>
typedef long long ll;
inline ll ans(ll n)
{
ll r = 0, m = sqrt(n), i;
for (i = 1; i <= m; ++i) r += n / i;
return (r << 1) - m * m;
}
int main()
{
int t;
ll n;
scanf("%d", &t);
while (t--)
{
scanf("%lld", &n);
printf("%lld\n", ans(n));
}
return 0;
}