题解:
没有思路先打表观察,可以发现函数
f
[
i
]
f[i]
f[i]有规律,会出现斐波那契数列式分层:
1 1
2 1
3 1 2
4 1 2 2
5 1 2 2 2 3
6 1 2 2 2 3 2 3 3
7 1 2 2 2 3 2 3 3 2 3 3 3 4
可以发现前
n
n
n项的和可以预处理其中的一部分,由于斐波那契数列增长速度接近指数,因此所需要的数组大小不会超过100。
剩余的数可以依据一定的规律进行处理。
实现细节见代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll g[100], f[100], pre[100], val[100];
void init() {
f[1] = f[2] = 1;
pre[1] = 1, pre[2] = 2;
val[1] = val[2] = 1;
g[1] = 1, g[2] = 2;
for (int i = 3; i <= 82; i++) {
f[i] = f[i - 1] + f[i - 2];
pre[i] = pre[i - 1] + f[i];
val[i] = val[i - 1] + val[i - 2] + f[i - 2];
g[i] = g[i - 1] + val[i];
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t;
init();
cin >> t;
while (t--) {
ll n;
cin >> n;
ll ans = 0, p;
p = upper_bound(pre + 1, pre + 83, n) - pre - 1;
ans = g[p];
n -= pre[p];
while (n > 0) {
p = upper_bound(f + 1, f + 83, n) - f - 1;
ans += val[p];
n -= f[p];
ans += n;
}
cout << ans << endl;
}
return 0;
}