题目链接:H(n)
题目大意:输入任意数字,输出H(n)的结果,H(n)函数如下
long long H(int n){
long long res = 0;
for( int i = 1; i <= n; i=i+1 ){
res = (res + n/i);
}
return res;
}
解题思路:由于极限数据为2e9,如果直接运算的话肯定会超时,因此我们只要将n/i相同的部分加起来,并且直接跳到后面即可。
代码如下:
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int inf = 0x3f3f3f3f;
const int maxn = 2e4 + 15;
ll H(ll n) {
ll res = n;
ll cur = 1, tmp;
for(int i = n / 2; i >= 1; i--) {
if(n / i != cur) {
tmp = n / i - cur;
cur = n / i;
res += tmp * i;
i = n / (cur + 1) + 1;
}
}
return res;
}
int main() {
#ifdef NEKO
freopen("Nya.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
int t; cin >> t;
while(t--) {
ll n; cin >> n;
if(n > 0) cout << H(n) << endl;
else cout << "0\n";
}
return 0;
}