#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
long long M, f[2010][5],
    chart1[210] = {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},
    chart2[233] = {
        0,         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,
        2000000000};
int N;
int main() {
  int i, j, k;
  long long o, p, s[3], ans, q;
  cin >> N >> M;
  s[1] = 0;
  s[2] = 0;
  for (i = 1; chart2[i] < M; i++) {
    q = min(M + 1, chart2[i + 1]);
    o = q - chart2[i];
    p = M * 2 - chart2[i] - q + 1;
    s[chart1[i]] = (o * p / 2 + s[chart1[i]]) % MOD;
  }
  o = M;
  s[0] = (M * (M - 1) / 2 - s[1] - s[2]) % MOD;
  f[0][0] = 1;
  for (i = 1; i <= N; i++)
    for (j = 0; j <= 3; j++)
      for (k = 0; k <= 2; k++)
        f[i][j] = (f[i][j] + f[i - 1][j ^ k] * s[k]) % MOD;
  ans = f[N][1] + f[N][2] + f[N][3];
  ans %= MOD;
  cout << ans << endl;
  return 0;
}
