Description
????????????N ?????????????????????????????? ?????????????????????????????????????????? ?????????????????? M ????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????????????????????????
??? ???????????????????????????????????? ?????????????????????????????????????????????????????????????????? mod P???P ???????????????N ?????????
Input
???????????????????????????N???M???P???
1???N???53???1???M???1000
Output
?????????????????????????????? mod P ????????????
Sample Input
3 4 97
Sample Output
20
polya?????????????????????????????????????????????????????????
????????????TM??????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????
????????????????????????polya??????????????????????????????\(N!\)???????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????
- ???\(i\)??????\(j\)????????????????????????\(L\)????????????????????????????????????\((i,j)\)??????????????????????????????????????????\(\lfloor\frac{L}{2}\rfloor\)???????????????????????????????????????????????????
- ???\(i\)??????\(j\)????????????\(L_{i}\)???\(L_{j}\)?????????????????????????????????????????????\((i,j)\)??????????????????????????????\(lcm(L_{i},L_{j})\)
?????????\(L_{1}\geqslant L_{2}\geqslant ...\geqslant L_{m}>0\)?????????\(L_{1}+L_{2}+...+L_{m}=N\)????????????\(L_{i}\)??????\(N\)?????????????????????????????????????????????\(L_{i}\)???????????????
??????\(N\leqslant 53\)????????????\(N\)???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????
???????????????????????????\(L_{1}\geqslant L_{2}\geqslant ...\geqslant L_{m}>0\)???????????????????????????\(1...N\)???\(N\)?????????????????????\(m\)???????????????????????????\(i\)???????????????\(L_{i}\)????????????????????????????????????????????????\(\dfrac{N!}{L_{1}!L_{2}!...L_{m}!}\)??????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????\((L_{1}-1)!(L_{2}-1)!...(L_{m}-1)!\)
?????????\(L_{i}=L_{i+1}=...=L_{j}\)??????????????????\((j-i+1)!\)?????????????????????????????????????????????\((j-i+1)!\)
???????????????????????????
\[\frac{N!}{L_{1}L_{2}...L_{m}k_{1}!k_{2}!...k_{t}!}\]
?????????\(t\)?????????\(t\)????????????\(L\)??????????????????\(k_{i}\)???
???????????????????????????????????????????????????
/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
int x=0,f=1;char ch=getchar();
for (;ch<???0???||ch>???9???;ch=getchar()) if (ch==???-???) f=-1;
for (;ch>=???0???&&ch<=???9???;ch=getchar()) x=(x<<1)+(x<<3)+ch-???0???;
return x*f;
}
inline void print(int x){
if (x>=10) print(x/10);
putchar(x%10+???0???);
}
const int N=1e3;
int fac[N+10],num[N+10],cnt[N+10];
int n,m,p,tot,Ans;
ll gcd(ll a,ll b){return !b?a:gcd(b,a%b);}
int mlt(ll a,ll b){
int res=1;a%=p;
for (;b;b>>=1,a=1ll*a*a%p) if (b&1) res=1ll*res*a%p;
return res;
}
void dfs(int now,int left){
if (!left){
ll a=1,b=0;
for (int i=1;i<=tot;i++){
a=a*mlt(num[i],cnt[i])%p*fac[cnt[i]]%p; //????????????L???k!
b+=cnt[i]*(cnt[i]-1)/2*num[i]+num[i]/2*cnt[i];
//?????????gcd??????????????????k*(k-1)????????????????????????????????????????????????????????????
for (int j=i+1;j<=tot;j++) b+=cnt[i]*cnt[j]*gcd(num[i],num[j]); //??????????????????????????????????????????????????????
}
a=1ll*mlt(a,p-2)*fac[n]%p;
Ans=(Ans+1ll*a*mlt(m,b)%p)%p;
}
if (now>left) return;
dfs(now+1,left); //??????????????????
for (int i=1;i*now<=left;i++){//???????????????
num[++tot]=now,cnt[tot]=i;
dfs(now+1,left-i*now);
tot--;
}
}
int main(){
n=read(),m=read(),p=read(),fac[0]=1;
for (int i=1;i<N;i++) fac[i]=1ll*fac[i-1]*i%p;
//???????????????????????????k!
dfs(1,n);
Ans=1ll*Ans*mlt(fac[n],p-2)%p; //??????
printf("%d\n",Ans);
return 0;
}