#include <bits/stdc++.h>
using namespace std;
long long pos[1005] = {
    1,         3,         4,         5,         7,         9,         13,
    15,        19,        27,        39,        40,        57,        58,
    81,        85,        120,       121,       174,       179,       255,
    260,       363,       382,       537,       544,       780,       805,
    1146,      1169,      1632,      1718,      2415,      2447,      3507,
    3622,      5154,      5260,      7341,      7730,      10866,     11011,
    15780,     16298,     23190,     23669,     33033,     34784,     48894,
    49549,     71007,     73340,     104352,    106510,    148647,    156527,
    220020,    222970,    319530,    330029,    469581,    479294,    668910,
    704371,    990087,    1003364,   1437882,   1485130,   2113113,   2156822,
    3010092,   3169669,   4455390,   4515137,   6470466,   6683084,   9509007,
    9705698,   13545411,  14263510,  20049252,  20318116,  29117094,  30073877,
    42790530,  43675640,  60954348,  64185794,  90221631,  91431521,  131026920,
    135332446, 192557382, 196540379, 274294563, 288836072, 405997338, 411441844,
    589621137, 608996006, 866508216, 884431705, 1000000001};
long long sg[1005] = {0, 1, 2, 1, 2, 0, 1, 2, 0, 1, 2, 0, 2, 1, 2, 0, 2,
                      1, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 1,
                      2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 1, 2,
                      0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0,
                      2, 1, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2,
                      1, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 1};
const long long mod = 1000000007;
long long n, p, v[3], dp[1001][4];
long long query(long long l, long long r) {
  l = p - l, r = p - r;
  return (l + r) * (l - r + 1) / 2 % mod;
}
signed main() {
  scanf("%lld%lld", &n, &p);
  for (long long i = 0; i < 102; i++) {
    if (pos[i] > p) break;
    long long l = pos[i], r = min(pos[i + 1] - 1, p);
    v[sg[i]] += query(l, r);
    v[sg[i]] %= mod;
  }
  dp[0][0] = 1;
  for (long long i = 1; i <= n; i++)
    for (long long j = 0; j <= 3; j++)
      for (long long k = 0; k <= 2; k++) {
        dp[i][j ^ k] = (dp[i][j ^ k] + dp[i - 1][j] * v[k] % mod) % mod;
      }
  printf("%lld\n", (dp[n][1] + dp[n][2] + dp[n][3]) % mod);
  return 0;
}
