#include <bits/stdc++.h>
// iostream is too mainstream
#include <cstdio>
// bitch please
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <cmath>
#include <iomanip>
#include <time.h>
#define dibs reserve
#define OVER9000 1234567890
#define ALL_THE(CAKE,LIE) for(auto LIE =CAKE.begin(); LIE != CAKE.end(); LIE++)
#define tisic 47
#define soclose 1e-8
#define chocolate win
// so much chocolate
#define patkan 9
#define ff first
#define ss second
#define abs(x) (((x) < 0)?-(x):(x))
#define uint unsigned int
#define dbl long double
#define pi 3.14159265358979323846
using namespace std;
// mylittledoge

using cat = long long;

#ifdef DONLINE_JUDGE
	// palindromic tree is better than splay tree!
	#define lld I64d
#endif

int main() {
	cin.sync_with_stdio(0);
	cin.tie(0);
	cout << fixed << setprecision(10);
	int N;
	cat M;
	cin >> N >> M;
	int K = N/2+1-(N%2 == 0);
	vector<cat> dp(N, 0);
	dp[0] = 1;
	for(int i = 1; i <= K; i++) {
		if(N%2 != 0 && i == K) {
			for(int j = N-1-K; j >= 0; j--) {
				dp[j+K] += dp[j];
				if(dp[j+K] >= M) dp[j+K] -= M;
			}
			continue;
		}
		for(int r = 0; r < i; r++) {
			cat s0 = 0, s1 = 0;
			for(int j = r, k = 0; j < N; j += i, k++) {
				s0 += dp[j];
				s1 += dp[j] * k;
				dp[j] = (s0 * (k+1) - s1) % M;
			}
		}
	}
	cat ans = 0;
	for(int i = 0; i < N; i++) ans += dp[i];
	ans %= M;
	cout << ans << "\n";
	return 0;
}

// look at my code
// my code is amazing
