Harmonic Number (II)(LightOJ - 1245)(整数分块板子题)
来源:Harmonic Number (II)
题意:
求i为1 ~ n,n / i 的和
思路:
整数分块:对于r = n / (n / l),i在[l, r]中,n / i全相等
坑点:这个题比较坑的是,如果循环的l用long long就会超时,而l可以取的极限恰好是int的极限范围,所以只能用int的同时,去特判而提前结束(因为这个T了好久,而且不是第一次因为使用long long而T了,主要是long long类型的取模和除法比较慢)
代码:
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
int t; scanf("%d", &t);
for (int k = 1; k <= t; ++k) {
int n; scanf("%d", &n);
ll ans = 0;
for (int l = 1, r; ; l = r + 1) {
r = n / (n / l);
ans += (r - l + 1) * (n / l);
if (r == n) break;
}
printf("Case %d: %lld\n", k, ans);
}
return 0;
}