UVA11526 H(n)

Ryan_

2019-10-05 15:53:07

Personal

**一道数论题** ~~uva的账号莫名没用所以提交不了?~~ n的范围是signed,按题面上打肯定回爆的~~也没有人蠢到把答案放到题面上吧~~ 怎么计算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 也许,我们可以 ![](https://ftp.bmp.ovh/imgs/2019/10/39008b0f91432814.png) ``` #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; } ```