#include <stdio.h>
#define MOD 1000000000
int dp[1000001]; // 全局数组,避免栈溢出
int split_number(int n) {
// 初始化dp数组
for (int i = 0; i <= n; i++) {
dp[i] = 0;
}
dp[0] = 1;
// 用位运算生成2的幂次并更新dp
int power = 1;
while (power <= n) {
for (int j = power; j <= n; j++) {
dp[j] = (dp[j] + dp[j - power]) % MOD;
}
power <<= 1; // 位运算代替乘法
}
return dp[n];
}
int main() {
int n;
scanf("%d", &n);
if (n >= 1 && n <= 1000000) {
printf("%d\n", split_number(n));
}
return 0;
}

京公网安备 11010502036488号