#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][2]{}; dp[0][0]=1;
for(int j=1; j<=n; j++){
for(int k=1; k<=i; k++){
if(((1ll<<k)-1)<=j){
if(k==i) {
dp[j][1]+=dp[j-((1ll<<k)-1)][0];
dp[j][1]%=M;
dp[j][1]+=dp[j-((1ll<<k)-1)][1];
dp[j][1]%=M;
}
else{
dp[j][0]+=dp[j-((1ll<<k)-1)][0];
dp[j][0]%=M;
}
}
}
}
ans+=dp[n][1];
}
cout<<ans<<endl;
}
int32_t main() {
fast;
int t;
t=1;
// cin>>t;
while(t--){
solve();
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSB1bGwgdW5zaWduZWQgbGwKI2RlZmluZSBsZCBsb25nIGRvdWJsZQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBmIGZpcnN0CiNkZWZpbmUgcyBzZWNvbmQKI2RlZmluZSBwcSBwcmlvcml0eV9xdWV1ZQojZGVmaW5lIGZhc3QgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKSxjaW4udGllKDApLGNvdXQudGllKDApCiNkZWZpbmUgcmVhZF9maWxlIGZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOyBmcmVvcGVuKCJvdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLy8gI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgovLyAjaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KLy8gdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiAKLy8gdGVtcGxhdGU8Y2xhc3MgVD4gdXNpbmcgb3JkZXJlZF9tdWx0aXNldCA9IHRyZWU8VCwgbnVsbF90eXBlLCBsZXNzX2VxdWFsPFQ+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKLy8gdGVtcGxhdGU8Y2xhc3MgVD4gdXNpbmcgb3JkZXJlZF9zZXQgPSB0cmVlPFQsIG51bGxfdHlwZSwgbGVzczxUPiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47Cgpjb25zdCBsbCBNPTFlOSs3OwoKdm9pZCBzb2x2ZSgpewogICAgaW50IG47IGNpbj4+bjsKICAgIGludCBsZz1fX2xnKG4pKzI7CiAgICBpbnQgYW5zPTA7CiAgICBmb3IoaW50IGk9MTsgaTw9bGc7IGkrKyl7CiAgICAgICAgaW50IGRwW24rMV1bMl17fTsgZHBbMF1bMF09MTsKICAgICAgICBmb3IoaW50IGo9MTsgajw9bjsgaisrKXsKICAgICAgICAgICAgZm9yKGludCBrPTE7IGs8PWk7IGsrKyl7CiAgICAgICAgICAgICAgICBpZigoKDFsbDw8ayktMSk8PWopewogICAgICAgICAgICAgICAgICAgIGlmKGs9PWkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZHBbal1bMV0rPWRwW2otKCgxbGw8PGspLTEpXVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgZHBbal1bMV0lPU07CgogICAgICAgICAgICAgICAgICAgICAgICBkcFtqXVsxXSs9ZHBbai0oKDFsbDw8ayktMSldWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBkcFtqXVsxXSU9TTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgZHBbal1bMF0rPWRwW2otKCgxbGw8PGspLTEpXVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgZHBbal1bMF0lPU07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFucys9ZHBbbl1bMV07CiAgICB9CiAgICBjb3V0PDxhbnM8PGVuZGw7Cn0KCmludDMyX3QgbWFpbigpIHsKICAgIGZhc3Q7CgogICAgaW50IHQ7CiAgICB0PTE7CiAgICAvLyBjaW4+PnQ7CiAgICB3aGlsZSh0LS0pewogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==