#include using namespace std; #define DEBUG(x) cout<<#x<<": "< #define vl vector #define vii vector< vector > #define vll vector< vector > #define vs vector #define pii pair #define pis pair #define psi pair #define pll pair #define fi first #define se second #define rep(i,n) for(int i=0;i<(int)(n);i++) #define rep1(i,n) for(int i=1;i<=(int)(n);i++) #define all(c) c.begin(),c.end() #define in(x, a, b) a <= x && x < b const int inf = 1000000001; const ll INF = 2e18; const ll MOD = 1000000007; //const ll mod = 1000000009; const double pi = 3.14159265358979323846; #define Sp(p) cout<> n; int ketanum = 1; ll mask = 1; rep1 (i, 62) { mask <<= 1; //cout << mask << endl; if (n & mask) { ketanum = i + 1; } } vector > dp(ketanum + 1, vector(4, vll(2, vl(2)))); dp[0][0][0][0] = 1; rep (keta, ketanum) { ll mask = 1LL << keta; rep (state, 4) { rep (up, 2) { rep (up2, 2) { int nketa = keta + 1; if ((mask & n) == 0) { dp[nketa][3][0][1] += dp[keta][state][up][up2]; dp[nketa][3][0][1] %= MOD; dp[nketa][state][up][up2] += dp[keta][state][up][up2]; dp[nketa][state][up][up2] %= MOD; dp[nketa][state | 2][1][up2] += dp[keta][state][up][up2]; dp[nketa][state | 2][1][up2] %= MOD; dp[nketa][state | 1][1][up2] += dp[keta][state][up][up2]; dp[nketa][state | 1][1][up2] %= MOD; } else { dp[nketa][state][0][1] += dp[keta][state][up][up2]; dp[nketa][state][0][1] %= MOD; dp[nketa][0][up][up2] += dp[keta][state][up][up2]; dp[nketa][0][up][up2] %= MOD; dp[nketa][state & 2][1][up2] += dp[keta][state][up][up2]; dp[nketa][state & 2][1][up2] %= MOD; dp[nketa][state & 1][1][up2] += dp[keta][state][up][up2]; dp[nketa][state & 1][1][up2] %= MOD; } } } } } cout << dp[ketanum][0][1][1] * mod_inverse(2) % MOD << endl; }