using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static long[] NList => ReadLine().Split().Select(long.Parse).ToArray(); public static void Main() { var n = long.Parse(ReadLine()); if (n < 3) { WriteLine(0); return; } var tmp = n; var len = 0; while (tmp > 0) { tmp >>= 1; ++len; } var mod = 1_000_000_007; var dp = new long[16]; // x:1 y:2 x=y=1:4 y=n:8 dp[10] = 1; for (var b = len - 2; b >= 0; --b) { var ndp = new long[16]; ndp[0] += dp[0] + dp[1] + dp[2]; ndp[1] += dp[0] + dp[1] + dp[2]; ndp[2] += dp[0] + dp[1] + dp[2] + 1; ndp[4] += dp[4] + dp[5] + dp[6] + dp[7]; ndp[5] += dp[4] + dp[5] + dp[6] + dp[7]; ndp[6] += dp[4] + dp[5] + dp[6] + dp[7]; ndp[7] += dp[0] + dp[1] + dp[2] + dp[4] + dp[5] + dp[6] + dp[7]; if (((n >> b) & 1) == 0) { ndp[8] += dp[8] + dp[9] + dp[10]; ndp[9] += dp[8] + dp[9] + dp[10]; ndp[12] += dp[12] + dp[13] + dp[14] + dp[15]; ndp[13] += dp[12] + dp[13] + dp[14] + dp[15]; } else { ndp[0] += dp[8] + dp[9] + dp[10]; ndp[1] += dp[8] + dp[9] + dp[10]; ndp[4] += dp[12] + dp[13] + dp[14] + dp[15]; ndp[5] += dp[12] + dp[13] + dp[14] + dp[15]; ndp[10] += dp[8] + dp[9] + dp[10]; ndp[14] += dp[12] + dp[13] + dp[14] + dp[15]; ndp[15] += dp[8] + dp[9] + dp[10] + dp[12] + dp[13] + dp[14] + dp[15]; } for (var i = 0; i < ndp.Length; ++i) ndp[i] %= mod; dp = ndp; } WriteLine((dp[4] + dp[5] + dp[6] + dp[7] + dp[12] + dp[13] + dp[14] + dp[15]) % mod); } }