#include<bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define ld long double
#define pb push_back
#define int long long
#define f first
#define s second
#define pq priority_queue
#define fast ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define read_file freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
using namespace std;
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
// template<class T> using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
// template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
const ll M=1e9+7;
void solve(){
int n; cin>>n;
int lg=__lg(n)+2;
int ans=0;
for(int i=1; i<=lg; i++){
int dp[n+1]{};
dp[0]=1;
for(int k=1; k<i; k++){
for(int j=1; j<=n; j++){
if(((1ll<<(k))-1)<=j){
dp[j]+=dp[j-((1ll<<(k))-1)];
dp[j]%=M;
}
}
}
for(int j=1; j<=n; j++){ // cnt of first value
if(n-j*((1ll<<(i))-1)<0) break;
ans+=dp[n-j*((1ll<<(i))-1)];
}
}
cout<<ans<<endl;
}
int32_t main() {
#ifndef ONLINE_JUDGE
read_file;
#endif
fast;
int t;
t=1;
// cin>>t;
while(t--){
solve();
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSB1bGwgdW5zaWduZWQgbGwKI2RlZmluZSBsZCBsb25nIGRvdWJsZQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBmIGZpcnN0CiNkZWZpbmUgcyBzZWNvbmQKI2RlZmluZSBwcSBwcmlvcml0eV9xdWV1ZQojZGVmaW5lIGZhc3QgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKSxjaW4udGllKDApLGNvdXQudGllKDApCiNkZWZpbmUgcmVhZF9maWxlIGZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOyBmcmVvcGVuKCJvdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLy8gI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgovLyAjaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KLy8gdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiAKLy8gdGVtcGxhdGU8Y2xhc3MgVD4gdXNpbmcgb3JkZXJlZF9tdWx0aXNldCA9IHRyZWU8VCwgbnVsbF90eXBlLCBsZXNzX2VxdWFsPFQ+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKLy8gdGVtcGxhdGU8Y2xhc3MgVD4gdXNpbmcgb3JkZXJlZF9zZXQgPSB0cmVlPFQsIG51bGxfdHlwZSwgbGVzczxUPiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47Cgpjb25zdCBsbCBNPTFlOSs3OwoKdm9pZCBzb2x2ZSgpewogICAgaW50IG47IGNpbj4+bjsKICAgIGludCBsZz1fX2xnKG4pKzI7CiAgICBpbnQgYW5zPTA7CiAgICBmb3IoaW50IGk9MTsgaTw9bGc7IGkrKyl7CiAgICAgICAgaW50IGRwW24rMV17fTsKICAgICAgICBkcFswXT0xOwogICAgICAgIGZvcihpbnQgaz0xOyBrPGk7IGsrKyl7CiAgICAgICAgICAgIGZvcihpbnQgaj0xOyBqPD1uOyBqKyspewogICAgICAgICAgICAgICAgaWYoKCgxbGw8PChrKSktMSk8PWopewogICAgICAgICAgICAgICAgICAgIGRwW2pdKz1kcFtqLSgoMWxsPDwoaykpLTEpXTsKICAgICAgICAgICAgICAgICAgICBkcFtqXSU9TTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IoaW50IGo9MTsgajw9bjsgaisrKXsgLy8gY250IG9mICBmaXJzdCB2YWx1ZQogICAgICAgICAgICBpZihuLWoqKCgxbGw8PChpKSktMSk8MCkgYnJlYWs7CiAgICAgICAgICAgIGFucys9ZHBbbi1qKigoMWxsPDwoaSkpLTEpXTsKICAgICAgICB9CiAgICB9CiAgICBjb3V0PDxhbnM8PGVuZGw7Cn0KCmludDMyX3QgbWFpbigpIHsKICAgICNpZm5kZWYgT05MSU5FX0pVREdFCiAgICAgICAgcmVhZF9maWxlOwogICAgI2VuZGlmCgogICAgZmFzdDsKCiAgICBpbnQgdDsKICAgIHQ9MTsKICAgIC8vIGNpbj4+dDsKICAgIHdoaWxlKHQtLSl7CiAgICAgICAgc29sdmUoKTsKICAgIH0KICAgIHJldHVybiAwOwp9