using System; using System.Collections.Generic; class Program { static void Main(string[] args) { long N = long.Parse(Console.ReadLine()); long mod = (long)Math.Pow(10,9)+7; long a = (long)Math.Pow(2,59); long b = 0; long ti = 59; long[]T = new long[60]; long tc = 0; long ans = 0; while(ti >= 0){ if(N >= b+a-1){ T[59-ti] = 1; long aa = a%mod; long aa2 =(a-1)%mod; for(var i=0;i<59-ti;i++){ if(T[i] == 1){ long ab = (long)Math.Pow(2,59-i)%mod; ans = (ans + (ti+tc*2)*aa%mod*ab%mod*Mpow(2,mod-2,mod)) % mod; } } ans = (ans + (1+ti+tc*2)*aa%mod*aa2%mod*Mpow(4,mod-2,mod)) % mod; b += a; tc += 1; } a /= 2; ti -= 1; } Console.WriteLine(ans); } public static long Mpow(long x,long n,long m) { long ans = 1; while(n > 0){ if(n % 2 == 1){ ans = ans * x % m; n -= 1; } x = x * x % m; n /= 2; } return ans; } }