#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
const int N = 1e5 + 7;
int n, m, k, p, ans, lim, r[N], w[N], c[N], f1[N], f2[N], f3[N], s1[N], s2[N],
    f[N], g[N], s[N];
namespace Math {
inline int pw(int base, int p, const int mod) {
  static int res;
  for (res = 1; p; p >>= 1, base = static_cast<long long>(base) * base % mod)
    if (p & 1) res = static_cast<long long>(res) * base % mod;
  return res;
}
inline int inv(int x, const int mod) { return pw(x, mod - 2, mod); }
}  // namespace Math
const int mod1 = 998244353, mod2 = 1004535809, mod3 = 469762049, G = 3;
const long long mod_1_2 = static_cast<long long>(mod1) * mod2;
const int inv_1 = Math::inv(mod1, mod2),
          inv_2 = Math::inv(mod_1_2 % mod3, mod3);
struct Int {
  int A, B, C;
  explicit inline Int() {}
  explicit inline Int(int __num) : A(__num), B(__num), C(__num) {}
  explicit inline Int(int __A, int __B, int __C) : A(__A), B(__B), C(__C) {}
  static inline Int reduce(const Int &x) {
    return Int(x.A + (x.A >> 31 & mod1), x.B + (x.B >> 31 & mod2),
               x.C + (x.C >> 31 & mod3));
  }
  inline friend Int operator+(const Int &lhs, const Int &rhs) {
    return reduce(
        Int(lhs.A + rhs.A - mod1, lhs.B + rhs.B - mod2, lhs.C + rhs.C - mod3));
  }
  inline friend Int operator-(const Int &lhs, const Int &rhs) {
    return reduce(Int(lhs.A - rhs.A, lhs.B - rhs.B, lhs.C - rhs.C));
  }
  inline friend Int operator*(const Int &lhs, const Int &rhs) {
    return Int(static_cast<long long>(lhs.A) * rhs.A % mod1,
               static_cast<long long>(lhs.B) * rhs.B % mod2,
               static_cast<long long>(lhs.C) * rhs.C % mod3);
  }
  inline int get() {
    long long x =
        static_cast<long long>(B - A + mod2) % mod2 * inv_1 % mod2 * mod1 + A;
    return (static_cast<long long>(C - x % mod3 + mod3) % mod3 * inv_2 % mod3 *
                (mod_1_2 % p) % p +
            x) %
           p;
  }
} a[N], b[N];
namespace Poly {
int lim, s, rev[N];
Int Wn[N | 1];
inline void init(int n) {
  s = -1, lim = 1;
  while (lim < n) lim <<= 1, ++s;
  for (register int i = 1; i < lim; ++i)
    rev[i] = rev[i >> 1] >> 1 | (i & 1) << s;
  const Int t(Math::pw(G, (mod1 - 1) / lim, mod1),
              Math::pw(G, (mod2 - 1) / lim, mod2),
              Math::pw(G, (mod3 - 1) / lim, mod3));
  *Wn = Int(1);
  for (register Int *i = Wn; i != Wn + lim; ++i) *(i + 1) = *i * t;
}
inline void NTT(Int *A, const int op = 1) {
  for (register int i = 1; i < lim; ++i)
    if (i < rev[i]) std::swap(A[i], A[rev[i]]);
  for (register int mid = 1; mid < lim; mid <<= 1) {
    const int t = lim / mid >> 1;
    for (register int i = 0; i < lim; i += mid << 1) {
      for (register int j = 0; j < mid; ++j) {
        const Int W = op ? Wn[t * j] : Wn[lim - t * j];
        const Int X = A[i + j], Y = A[i + j + mid] * W;
        A[i + j] = X + Y, A[i + j + mid] = X - Y;
      }
    }
  }
  if (!op) {
    const Int ilim(Math::inv(lim, mod1), Math::inv(lim, mod2),
                   Math::inv(lim, mod3));
    for (register Int *i = A; i != A + lim; ++i) *i = (*i) * ilim;
  }
}
}  // namespace Poly
inline void mul() {
  for (int i = 0; i < lim; i++) a[i] = Int(f1[i]), b[i] = Int(f2[i]);
  Poly::NTT(a), Poly::NTT(b);
  for (int i = 0; i < Poly::lim; i++) a[i] = a[i] * b[i];
  Poly::NTT(a, 0);
  for (int i = 0; i < lim; i++) f3[i] = a[i].get();
}
int main() {
  cin >> n >> m >> p;
  if (m == 1) {
    cout << 0 << endl;
    return 0;
  }
  m /= 2;
  while (m > 0) w[++w[0]] = m, m /= 2;
  f[1] = 1;
  Poly::init(2 * n + 2), lim = Poly::lim;
  for (int i = 0; i < lim; i++) r[i] = (r[i >> 1] >> 1) | (i & 1) << (k - 1);
  for (int i = w[0]; i > 1; i--) {
    int x = w[i], y = w[i - 1];
    for (int j = 1; j <= n; j += 2) ans = (ans + f[j]) % p;
    for (int j = 0; j <= n; j++) c[j] = (f[j] + g[j]) % p;
    for (int j = 1; j <= n; j++) f1[j] = c[j];
    f1[0] = 1;
    for (int j = 1; j <= n; j++) f2[j] = f[j];
    mul();
    for (int j = 1; j <= n; j++) s1[j] = f3[j];
    for (int j = 1; j <= n; j++) f1[j] = c[j];
    f1[0] = 1;
    for (int j = 1; j <= n; j++) f2[j] = g[j];
    mul();
    for (int j = 1; j <= n; j++) s2[j] = f3[j];
    if (x % 2 == 0)
      for (int j = 1; j <= n; j++)
        f[j] = (f[j] + s1[j]) % p, g[j] = (g[j] + s2[j]) % p;
    else
      for (int j = 1; j <= n; j++)
        f[j] = (f[j] + s2[j]) % p, g[j] = (g[j] + s1[j]) % p;
    if (y % 2 == 1) {
      for (int j = 0; j <= n; j++) c[j] = (f[j] + g[j]) % p;
      c[0] = 1;
      for (int j = 1; j <= n; j++) f[j] = (f[j] + c[j - 1]) % p;
    }
  }
  for (int j = 1; j <= n; j += 2) ans = (ans + f[j]) % p;
  cout << ans << endl;
  return 0;
}
