一望而知的递归题,因此首先寻找规律。
显然可以且仅可以展开为
。对于一个非
正整数
,其一定可以表示为
,而
显然无法被进一步展开,因此其展开方法数
至少应该等于
,即
。若
为奇数,则
和
的展开相比仅可能在
的所有展开的基础上多出一个
(这是因为
的所有整数幂中只有
为奇数),因此
另一方面,若
为偶数时,其可以通过有
种展开的奇数
加上
得到,也可以通过
的展开基础上再重复一次展开得到;因此
据上方可知
#include <bits/stdc++.h>
#define _CRT_SECURE_NO_DEPRECATE
int main() {
int n;
std::cin >> n;
std::vector<int> f(n + 1);
for (int i = 1; i <= n; i++) {
if (i == 1) f[i] = 1;
else if (i % 2) f[i] = f[i - 1];
else f[i] = (f[i - 1] + f[i / 2]) % 1000000000;
}
std::cout << f[n] % 1000000000 << std::endl;
}
若使用递归函数,代码会对大数发生栈溢造成超时,因此使用数组存储中间值。