#include <bits/stdc++.h>
using namespace std;

const int maxN = 155;

int n, m, mod;
int f[maxN + 1][maxN + 1][maxN + 1], g[maxN + 1][maxN + 1];
int ans;

inline int ADD(int x, int y) { return x + y >= mod ? x + y - mod : x + y; }

inline int solve1()
{
	f[0][0][0] = 1;
	for(int i = 1; i <= m / 2; i++)
	{
		for(int j = 0; j <= i - 1; j++) f[i][0][0] = ADD(f[i][0][0], f[i - 1][0][j]);

		for(int j = 1; j <= i; j++) 
			f[i][0][j] = f[i - 1][0][j - 1];	
	}
	for(int i = m / 2 + 1; i <= n / 2; i++)
	{
		//none
		for(int j = 0; j <= m + 1; j++) 
			for(int k = 0; k <= i - 1; k++)
				f[i][0][0] = ADD(f[i][0][0], f[i - 1][j][k]);
		for(int j = 1; j <= i - m / 2; j++) f[i][0][0] = ADD(f[i][0][0], g[i - 1][j]);
		//left
		g[i][1] = f[i - 1][0][0];
		for(int j = 1; j <= i - 1; j++) g[i][1] = ADD(g[i][1], f[i - 1][0][j]);
		for(int j = 2; j <= i - m / 2; j++) g[i][j] = g[i - 1][j - 1];
		for(int j = 3; j <= m + 1; j++)
			for(int k = 0; k <= i - 1; k++)
				f[i][j][0] = ADD(f[i][j][0], f[i - 1][j - 1][k]);
		//right
		for(int j = 0; j <= m + 1; j++) f[i][0][1] = ADD(f[i][0][1], f[i - 1][j][0]);
		for(int j = 1; j <= i - m / 2 - 1; j++) f[i][0][1] = ADD(f[i][0][1], g[i - 1][j]);
		for(int j = 2; j <= i; j++) 
		{
			f[i][0][j] = f[i - 1][0][j - 1];
			for(int k = 2; k <= m + 1; k++) f[i][0][j] = ADD(f[i][0][j], f[i - 1][k][j - 1]);
		}
		//both
		f[i][2][1] = f[i - 1][0][0];
		for(int j = 1; j <= i - m / 2 - 1; j++) f[i][2][1] = ADD(f[i][2][1], g[i - 1][j]);
		for(int j = 3; j <= m + 1; j++)
		{
			f[i][j][j - 1] = f[i - 1][0][j - 2];
			for(int k = 1; k <= i; k++) f[i][j][k] = ADD(f[i][j][k], f[i - 1][j - 1][k - 1]);
		}
	}
	int last = n - n / 2 + m / 2;
	for(int i = n / 2 + 1; i <= last; i++)
	{
		for(int j = 0; j <= m + 1; j++) 
			for(int k = 0; k <= n / 2; k++)
				f[i][0][0] = ADD(f[i][0][0], f[i - 1][j][k]);
		for(int j = 1; j <= i - m / 2; j++) f[i][0][0] = ADD(f[i][0][0], g[i - 1][j]);

		g[i][1] = f[i - 1][0][0];
		for(int j = 1; j <= i - 1; j++) g[i][1] = ADD(g[i][1], f[i - 1][0][j]);
		for(int j = 2; j <= i - m / 2; j++) g[i][j] = g[i - 1][j - 1];
		for(int j = 3; j <= m + 1; j++)
			for(int k = 0; k <= i - 1; k++)
				f[i][j][0] = ADD(f[i][j][0], f[i - 1][j - 1][k]);
	}
	int ans = f[last][0][0];
	for(int j = 1; j <= n / 2; j++) ans = ADD(ans, f[last][0][j]);
	for(int i = 2; i <= m + 1; i++) 
		for(int j = 0; j <= n / 2; j++) ans = ADD(ans, f[last][i][j]);
	for(int i = 1; i <= n - n / 2; i++) ans = ADD(ans, g[last][i]);
	return ans;
}

inline int solve2(int n)
{
	memset(g, 0, sizeof(g));
	int ans = 1;
	g[0][0] = 1;
	for(int i = 1; i <= n; i++)
	{
		for(int j = 0; j <= min(i - 1, m / 2); j++) g[i][0] = ADD(g[i][0], g[i - 1][j]);
		for(int j = 1; j <= min(i, m / 2); j++)
			g[i][j] = g[i - 1][j - 1], ans = ADD(ans, g[i][j]);
	}
	return ans;
}

int main()
{
	scanf("%d %d %d", &n, &m, &mod);
	if(m & 1) printf("%d", solve1());
	else printf("%d", 1ll * solve2(n / 2) * solve2(n - n / 2) % mod);
	return 0;
}