#include #include #include using namespace std; // 場合の数、総和 long long int dp[65][65][2][2]; const long long int MOD = 1000000007LL; int main() { long long int N, ans = 0; cin >> N; string s = ""; for(int i=0; i<60; i++, N>>=1) { s += (char)('0' + (N & 1)); } reverse(s.begin(), s.end()); fill(dp[0][0][0], dp[60][0][0], 0); dp[0][0][0][0] = 1; for(int i=0; i<60; i++) { for(int j=0; j<=i; j++) { for(int f=0; f<2; f++) { int lim = f ? 1 : (s[i] - '0'); for(int x=0; x<=lim; x++) { (dp[i+1][j+x][f || x < lim][0] += dp[i][j][f][0]) %= MOD; (dp[i+1][j+x][f || x < lim][1] += dp[i][j][f][1] * 2 + dp[i][j][f][0] * x) %= MOD; } } } } for(int i=0; i<60; i++) { (ans += i * (dp[60][i][0][1] + dp[60][i][1][1])) %= MOD; } cout << ans << endl; return 0; }