#include <bits/stdc++.h>
int N, M, Ans;
int i, j, t, aux;
long long Nr[5];
long long D[1010][5];
int A[105] = {
    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};
int Val[105] = {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};
int main() {
  scanf("%d %d\n", &N, &M);
  for (i = 0; 1; ++i) {
    if (A[i + 1] > M) A[i + 1] = M;
    Nr[Val[i]] +=
        1LL * (A[i + 1] - A[i]) * (2LL * M - A[i] - A[i + 1] + 1) / 2LL;
    Nr[Val[i]] %= 1000000007;
    if (A[i + 1] >= M) break;
  }
  D[0][0] = 1LL;
  for (i = 0; i < N; ++i)
    for (j = 0; j <= 3; ++j)
      for (t = 0; t <= 2; ++t) {
        aux = j ^ t;
        D[i + 1][aux] = (D[i + 1][aux] + D[i][j] * Nr[t]) % 1000000007;
      }
  Ans = 0;
  for (i = 1; i <= 3; ++i) Ans = (Ans + D[N][i]) % 1000000007;
  printf("%d\n", Ans);
  return 0;
}
