#include<bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
//#define mod 1000000007ll
#define INF 1000000000000000000ll
int dp[4][1010][20];
int ty[4][1010][20];
int wyn[1010][20];
int dwumian[1010][1010];
int N, K, mod;
void init() {
for( int n=0; n<=1000; n++ ) {
dwumian[n][0] = 1;
dwumian[n][n] = 1;
for( int k=1; k<n; k++ ) {
dwumian[n][k] = (dwumian[n-1][k-1] + dwumian[n-1][k])%mod;
}
}
}
int res( int n, int k ) {
if( k>10 ) return 0;
return (wyn[n][k]-wyn[n][k-1]+mod)%mod;
}
int32_t main() {
ios_base::sync_with_stdio( 0 );
cin.tie( 0 );
cin >> N >> K >> mod;
init();
for( int i=0; i<4; i++ ) {
//dp[i][0][0] = 1;
for( int k=0; k<20; k++ ) {
dp[i][0][k] = 1;
}
}
for( int n=1; n<=1005; n++ ) {
for( int k=1; k<=11; k++ ) {
for( int j=1; j<=n; j++ ) {
dp[3][n][k] = (dp[3][n][k] + (dp[3][j-1][k]*dp[3][n-j][k]-ty[3][j-1][k]*ty[3][n-j][k]+mod*mod)%mod*dwumian[n-1][j-1])%mod;
}
ty[3][n][k] = (dp[3][n][k]-dp[3][n][k-1]+mod)%mod;
for( int j=1; j<=n; j++ ) {
dp[2][n][k] = (dp[2][n][k] + (dp[3][j-1][k-1]*dp[2][n-j][k])%mod*dwumian[n-1][j-1])%mod;
}
ty[2][n][k] = (dp[2][n][k]-dp[2][n][k-1]+mod)%mod;
}
}
for( int n=0; n<=1005; n++ ) {
for( int k=0; k<=11; k++ ) {
for( int j=1; j<=n; j++ ) {
wyn[n][k] = (wyn[n][k] + dp[2][j-1][k]*dp[2][n-j][k]%mod*dwumian[n-1][j-1])%mod;
}
}
}
/*int x=0;
for( int i=1; i<=1000; i++ ) {
for( int j=1; j<=1000; j++ ) {
x = (x + i*j*res(i, j))%mod;
}
}
cout << x << "\n";*/
cout << res( N, K );
//cout << dp[0][N][K]
return 0;
}/*
1 1 100000007
*/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #include<bits/stdc++.h> using namespace std; #define int long long #define double long double //#define mod 1000000007ll #define INF 1000000000000000000ll int dp[4][1010][20]; int ty[4][1010][20]; int wyn[1010][20]; int dwumian[1010][1010]; int N, K, mod; void init() { for( int n=0; n<=1000; n++ ) { dwumian[n][0] = 1; dwumian[n][n] = 1; for( int k=1; k<n; k++ ) { dwumian[n][k] = (dwumian[n-1][k-1] + dwumian[n-1][k])%mod; } } } int res( int n, int k ) { if( k>10 ) return 0; return (wyn[n][k]-wyn[n][k-1]+mod)%mod; } int32_t main() { ios_base::sync_with_stdio( 0 ); cin.tie( 0 ); cin >> N >> K >> mod; init(); for( int i=0; i<4; i++ ) { //dp[i][0][0] = 1; for( int k=0; k<20; k++ ) { dp[i][0][k] = 1; } } for( int n=1; n<=1005; n++ ) { for( int k=1; k<=11; k++ ) { for( int j=1; j<=n; j++ ) { dp[3][n][k] = (dp[3][n][k] + (dp[3][j-1][k]*dp[3][n-j][k]-ty[3][j-1][k]*ty[3][n-j][k]+mod*mod)%mod*dwumian[n-1][j-1])%mod; } ty[3][n][k] = (dp[3][n][k]-dp[3][n][k-1]+mod)%mod; for( int j=1; j<=n; j++ ) { dp[2][n][k] = (dp[2][n][k] + (dp[3][j-1][k-1]*dp[2][n-j][k])%mod*dwumian[n-1][j-1])%mod; } ty[2][n][k] = (dp[2][n][k]-dp[2][n][k-1]+mod)%mod; } } for( int n=0; n<=1005; n++ ) { for( int k=0; k<=11; k++ ) { for( int j=1; j<=n; j++ ) { wyn[n][k] = (wyn[n][k] + dp[2][j-1][k]*dp[2][n-j][k]%mod*dwumian[n-1][j-1])%mod; } } } /*int x=0; for( int i=1; i<=1000; i++ ) { for( int j=1; j<=1000; j++ ) { x = (x + i*j*res(i, j))%mod; } } cout << x << "\n";*/ cout << res( N, K ); //cout << dp[0][N][K] return 0; }/* 1 1 100000007 */ |
English