#include <bits/stdc++.h>
using namespace std;
int main() {
int N;
cin>>N;
int dp[N+1];//dp[i]=整数i的拆分种数
dp[1]=1;//整数1只有一种拆分方式
dp[2]=2;//整数2可以有两种拆分方式
for(int i=3;i<=N;i++)
{
//1.如果是奇数,拆分中一定包含1,只要dp[i/2]中每种拆分方式都加个1,就肯定包含1
if(i%2==1)
{
dp[i]=dp[i-1]%1000000000;
}
//2.如果是偶数,有且仅有两种可能,包含1或者不包含1
//dp[i-1]是包含1的种类,原因同上
//dp[i/2]是不包含1的拆分方式数目,只要dp[i/2]中每种拆分方式中的每个元素都×2,就肯定不包含1
else {
dp[i]=(dp[i-1]+dp[i/2])%1000000000;
}
}
cout<<dp[N];
}
// 64 位输出请用 printf("%lld")



京公网安备 11010502036488号