#include <bits/stdc++.h>
using namespace std;
const int mod = 1E9 + 7;
int n, p;
int f[] = {
    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 num[] = {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 g[4];
inline int s(int l, int r, int x) { return 1ll * (l + r) * x / 2 % mod; }
int ans[1010][4];
int main() {
  int las = 1;
  scanf("%d%d", &n, &p);
  for (int i = 0;; i++) {
    int t = min(p, f[i] - 1);
    g[num[i]] += s(p - las, p - t, t - las + 1);
    if (g[num[i]] >= mod) g[num[i]] -= mod;
    if (f[i] > p) break;
    las = f[i];
  }
  ans[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= 3; j++) {
      for (int k = 0; k <= 3; k++) {
        ans[i][j] += 1ll * ans[i - 1][j ^ k] * g[k] % mod;
        if (ans[i][j] >= mod) ans[i][j] -= mod;
      }
    }
  }
  printf("%d", ((ans[n][1] + ans[n][2] - mod + ans[n][3]) % mod + mod) % mod);
  return 0;
}
