一望而知的递归题,因此首先寻找规律。

显然可以且仅可以展开为。对于一个非正整数,其一定可以表示为,而显然无法被进一步展开,因此其展开方法数至少应该等于,即。若为奇数,则的展开相比仅可能在的所有展开的基础上多出一个(这是因为的所有整数幂中只有为奇数),因此另一方面,若为偶数时,其可以通过有种展开的奇数加上得到,也可以通过的展开基础上再重复一次展开得到;因此

据上方可知

#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;
}

若使用递归函数,代码会对大数发生栈溢造成超时,因此使用数组存储中间值。