#include <cstdio>
#include <algorithm>
using namespace std;

#define ll long long
#define mul(a, b) (((ll)(a) * (ll)(b)) % MOD)

int N, K, MOD;

int f1[155][155];
int f[155][80][80][80];

int work_easy(int siz, int consec)
{
    for (int i = 0; i < 155; i++) {
        for (int j = 0; j < 155; j++) {
            f1[i][j] = 0;
        }
    }
    f1[0][0] = 1;
    for (int i = 0; i < siz; i++) {
        for (int j = 0; j <= consec; j++) {
            f1[i+1][j+1] += f1[i][j];
            if (f1[i+1][j+1] >= MOD) f1[i+1][j+1] -= MOD;
            f1[i+1][0] += f1[i][j];
            if (f1[i+1][0] >= MOD) f1[i+1][0] -= MOD;
        }
    }
    int ans = 0;
    for (int i = 0; i <= consec; i++) {
        ans += f1[siz][i];
        if (ans >= MOD) ans -= MOD;
    }
    return ans;
}

int main()
{
    scanf("%d%d%d", &N, &K, &MOD);
    if (K % 2 == 0) {
        printf("%d", (int)mul(work_easy(N / 2, K / 2),
            work_easy(N / 2 + (N % 2), K / 2)));
        return 0;
    }
    f[0][0][0][N / 2 + 2] = 1;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j <= N / 2 + 1; j++) {
            for (int k = 0; k <= N / 2 + 1; k++) {
                for (int l = max(j, k) + 1; l <= N / 2 + 2; l++) {
                    int& add0 = f[i+1][0][j][j <= k ? N / 2 + 2 : l];
                    int& add1 = f[i+1][k+1][j][
                        (k+1 <= j || j == 0 || 2 * k < K + 1) ? l
                        : min(max(k + 1 + (K + 1 - 2 * j) / 2, 0), l)];
                    add0 += f[i][j][k][l];
                    if (add0 >= MOD) add0 -= MOD;
                    add1 += f[i][j][k][l];
                    if (add1 >= MOD) add1 -= MOD;
                }
            }
        }
    }
    int ans = 0;
    for (int j = 0; j <= N / 2 + 1; j++) {
        for (int k = 0; k <= N / 2 + 1; k++) {
            for (int l = max(j, k) + 1; l <= N / 2 + 2; l++) {
                ans += f[N][j][k][l];
                if (ans >= MOD) ans -= MOD;
            }
        }
    }
    printf("%d", ans);
    return 0;
}
