将N分解为素数的和。LCM太大,故使用对数保存lcm
#include<bits/stdc++.h>
using namespace std;
#define first fst
#define second sec
#define sci(num) scanf("%d",&num)
#define scl(num) scanf("%lld",&num)
#define mem(a, b) memset(a,b,sizeof a)
#define cpy(a, b) memcopy(a,b,sizeof a)
typedef long long LL;
typedef pair<int, int> pair;
const int MAX_N = 3e3 + 100;
bool isp[MAX_N];
int prms[MAX_N], cnt;
double facs[MAX_N];
int dp[MAX_N];
int main() {
mem(isp, 0);
cnt = 0;
for (int i = 2; i < MAX_N; i++) {
if (isp[i]) continue;
prms[cnt++] = i;
for (int j = i + i; j < MAX_N; j += i) {
isp[j] = true;
}
}
int N, M;
// sci(N);
// sci(M);
while (~scanf("%d%d", &N, &M)) {
for (int i = 0; i <= N; i++)
facs[i] = 0;
for (int i = 0; i <= N; i++)
dp[i] = 1;
for (int j = 0; j < cnt && prms[j] <= N; j++) {
for (int i = N; i >= prms[j]; i--) {
for (int k = prms[j]; k <= i; k *= prms[j]) {
if (facs[i - k] + log(k) > facs[i]) {
facs[i] = facs[i - k] + log(k);
dp[i] =dp[i - k] * k % M;
}
}
}
}
printf("%d\n", dp[N]);
}
return 0;
}