#include <bits/stdc++.h>
using namespace std;
const int N = 1005, P = 1000000007;
using ll = long long;
int pos[] = {
    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 sg[] = {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 n, p;
inline ll calc(int l, int r) {
  l = p - l;
  r = p - r;
  swap(l, r);
  return ll(l + r) * (r - l + 1) / 2 % P;
}
ll g[3], dp[N][4];
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> p;
  for (int i = 0; i < 102; i++) {
    if (pos[i] > p) break;
    int l = pos[i], r = min(pos[i + 1] - 1, p);
    g[sg[i]] = (g[sg[i]] + calc(l, r)) % P;
  }
  dp[0][0] = 1;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < 4; j++)
      for (int k = 0; k < 3; k++)
        dp[i + 1][j ^ k] = (dp[i + 1][j ^ k] + dp[i][j] * g[k] % P) % P;
  ll ans = 0;
  for (int i = 1; i < 4; i++) ans = (ans + dp[n][i]) % P;
  cout << ans << endl;
  return 0;
}
