#include <bits/stdc++.h>
using namespace std;
struct timer {
  time_t start;
  timer() { start = clock(); }
  ~timer() {
    cerr << 1. * (clock() - start) / CLOCKS_PER_SEC << " secs" << endl;
  }
};
int seq[] = {
    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[] = {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, -1};
long long n, p, dp[1010][4];
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cin >> n >> p;
  long long c[3] = {};
  for (int i = 0; i < (102); i++) {
    if (p <= seq[i + 1]) {
      c[val[i]] += ((p - seq[i]) + 1) * (p - seq[i]) / 2;
      break;
    } else {
      c[val[i]] +=
          ((p - seq[i]) + (p - seq[i + 1] + 1)) * (seq[i + 1] - seq[i]) / 2;
    }
  }
  for (int i = 0; i < (3); i++) c[i] %= 1000000007LL;
  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][j] * c[k] % 1000000007LL;
      }
    }
  cout << (dp[n][1] + dp[n][2] + dp[n][3]) % 1000000007LL;
}
