#include<bits/stdc++.h>
using namespace std;
//背包问题求限制条件的方案数,求装满的前提下的方案数(不是最优解也可)
//这个题等价于求完全背包的方案数,dp数组表示装满的方案数目,只包括装满了的,这取决于初始值,
//如果dp数组表示总方案数,包括没装满的,那么初始值不同
//数组太大使用滚动数组+完全背包的优化
//dp[i][j]=dp[i][j-w]+dp[i-1][j]
int n,m,dp[1000000+10],p=1000000000,a[20];
int main() {
while(cin >> n){
//10^6最多分解到2^19,则计算背包物品
for(int i=0;i<20;i++){
a[i]=(1<<i);
}
memset(dp,0, sizeof(dp));
for(int i=0;i<=n;i++) dp[i]=1;//这里0也有1种情况,因为2 4 8等会用到dp[0]
for(int i=1;i<20;i++){
for(int j=0;j<=n;j++){
if(j>=a[i])
dp[j]=(dp[j]+dp[j-a[i]])%p;
}
}
cout<<dp[n]<<endl;
}
return 0;
}