#include <iostream>
#include <cstdio>
#include <cstring >
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
#define maxn 3100
int prime[maxn];
double d[maxn];
int ans[maxn];
int vis[maxn];
int n,MOD;
void init()
{
memset(ans,0,sizeof(ans));
memset(d,0,sizeof(d));
}
int pow(int a,int b)
{
int answer=1;
for(int i=1;i<=b;i++)
answer*=a;
return answer;
}
void solve()
{
for(int j=0;j<=n;j++)
{
d[j]=0;
ans[j]=1;
}
for(int i=2;prime[i]<=n;i++)
{
for(int j=n;j>=0;j--)
{
for(int k=1;pow(prime[i],k)<=j;k++)
//对于第k个素数,有两种选择
{
int s=pow(prime[i],k);
if(j>=s)
if(d[j-s]+log(s*1.0) > d[j] )
{
d[j]=d[j-s]+log(s*1.0);
ans[j]= ( (ans[j-s]*s) )%MOD;
}
}
//printf("%d ",ans[j]);
}
// printf("\n");
}
printf("%d\n",ans[n]);
}
int main()
{
//cout<<log(2.718281828459)<<endl;
int N=maxn-1;
int m=sqrt(N+0.5);
memset(vis,0,sizeof(vis));
for(int i=2;i<=m;i++)
if(!vis[i])
for(int j=i*i;j<=N;j+=i)
vis[j]=1;
int t=1;
for(int i=1;i<=N;i++)
if(vis[i]==0)
prime[t++]=i;
/* for(int i=1;i<10;i++)
{
printf("%d ",prime[i]);
}*/
//cout<<endl;
while(~scanf("%d%d",&n,&MOD))
{
init();
solve();
}
return 0;
}
08-11