#include<bits/stdc++.h>
using namespace std;
/* 0 -> normalnie
* 1 -> zawsze pęka z lewej
* 2 -> zawsze pęka z prawej
* 3 -> zawsze pęka z obu
*/
long long dp[1010][20][5];
int sum[1010][20][5]; //suma[x][y][z]= i=1 -> y dp[x][i][z]
int wspol[1010][1010]; // n po k
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n,k,p,i,j,x;
long long a;
cin>>n>>k>>p;
if(k>log2(n)+1)
{
cout<<"0";
return 0;
}
wspol[1][0]=1;
wspol[1][1]=1;
for(i=2;i<=n;i++)
{
wspol[i][0]=1;
for(j=1;j<=i;j++)
{
wspol[i][j]=(wspol[i-1][j-1]+wspol[i-1][j])%p;
//cout<<i<<" po "<<j<<" = "<<wspol[i][j]<<"\n";
}
}
dp[0][0][0]=1;
dp[0][0][1]=1;
dp[0][0][2]=1;
dp[0][0][3]=1;
dp[1][0][0]=1;
dp[1][1][1]=1;
dp[1][1][2]=1;
dp[1][1][3]=1;
sum[1][0][0]=1;
for(i=0;i<=k;i++)
{
for(j=0;j<=3;j++)
sum[0][i][j]=1;
}
for(i=1;i<=k;i++)
{
for(j=0;j<=3;j++)
sum[1][i][j]=1;
}
for(i=2;i<=n;i++)
{
for(j=1;j<=k;j++)
{
// x z lewej
for(x=0;x<i;x++)
{
if((i==n)&&(j==k))
{
// 0
// z lewej j z prawej mniej
//dp[i][j][0]=(dp[i][j][0]+(((dp[x][j][2]*sum[i-x-1][j-1][1])%p)*wspol[i-1][x])%p)%p;
a=dp[x][j][2]*sum[i-x-1][j-1][1];
// z lewej mniej z prawej j
//dp[i][j][0]=(dp[i][j][0]+(((sum[x][j-1][2]*dp[i-x-1][j][1])%p)*wspol[i-1][x])%p)%p;
a+=sum[x][j-1][2]*dp[i-x-1][j][1];
// oba j
//dp[i][j][0]=(dp[i][j][0]+(((dp[x][j][2]*dp[i-x-1][j][1])%p)*wspol[i-1][x])%p)%p;
a+=dp[x][j][2]*dp[i-x-1][j][1];
dp[i][j][0]=(dp[i][j][0]+wspol[i-1][x]*(a%p))%p;
}
// 1
// z lewej j-1 z prawej mniej lub równo j
//dp[i][j][1]=(dp[i][j][1]+(((dp[x][j-1][3]*sum[i-x-1][j][1])%p)*wspol[i-1][x])%p)%p;
a=dp[x][j-1][3]*sum[i-x-1][j][1];
// z lewej mniej niż j-1 z prawej j
//dp[i][j][1]=(dp[i][j][1]+(((sum[x][j-2][3]*dp[i-x-1][j][1])%p)*wspol[i-1][x])%p)%p;
a+=sum[x][j-2][3]*dp[i-x-1][j][1];
dp[i][j][1]=(dp[i][j][1]+wspol[i-1][x]*(a%p))%p;
/*
// 2
// z lewej mniej lub równo j z prawej j-1
dp[i][j][2]=(dp[i][j][2]+(((sum[x][j][2]*dp[i-x-1][j-1][3])%p)*wspol[i-1][x])%p)%p;
// z lewej j z prawej mniej niż j-1
dp[i][j][2]=(dp[i][j][2]+(((dp[x][j][2]*sum[i-x-1][j-2][3])%p)*wspol[i-1][x])%p)%p;
*/
// 3
// z lewej j z prawej mniej
//dp[i][j][3]=(dp[i][j][3]+(((dp[x][j][3]*sum[i-x-1][j-1][3])%p)*wspol[i-1][x])%p)%p;
a=dp[x][j][3]*sum[i-x-1][j-1][3];
// z lewej mniej z prawej j
//dp[i][j][3]=(dp[i][j][3]+(((sum[x][j-1][3]*dp[i-x-1][j][3])%p)*wspol[i-1][x])%p)%p;
a+=sum[x][j-1][3]*dp[i-x-1][j][3];
// oba j-1
//dp[i][j][3]=(dp[i][j][3]+(((dp[x][j-1][3]*dp[i-x-1][j-1][3])%p)*wspol[i-1][x])%p)%p;
a+=dp[x][j-1][3]*dp[i-x-1][j-1][3];
dp[i][j][3]=(dp[i][j][3]+wspol[i-1][x]*(a%p))%p;
}
dp[i][j][2]=dp[i][j][1];
//sum[i][j][0]=sum[i][j-1][0]+dp[i][j][0];
sum[i][j][1]=(sum[i][j-1][1]+dp[i][j][1])%p;
sum[i][j][2]=(sum[i][j-1][2]+dp[i][j][2])%p;
sum[i][j][3]=(sum[i][j-1][3]+dp[i][j][3])%p;
//cout<<"dp["<<i<<"]["<<j<<"] [1]="<<dp[i][j][1]<<" [2]="<<dp[i][j][2]<<" [3]="<<dp[i][j][3]<<"\n";
}
}
cout<<dp[n][k][0];
return 0;
}
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include<bits/stdc++.h> using namespace std; /* 0 -> normalnie * 1 -> zawsze pęka z lewej * 2 -> zawsze pęka z prawej * 3 -> zawsze pęka z obu */ long long dp[1010][20][5]; int sum[1010][20][5]; //suma[x][y][z]= i=1 -> y dp[x][i][z] int wspol[1010][1010]; // n po k int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n,k,p,i,j,x; long long a; cin>>n>>k>>p; if(k>log2(n)+1) { cout<<"0"; return 0; } wspol[1][0]=1; wspol[1][1]=1; for(i=2;i<=n;i++) { wspol[i][0]=1; for(j=1;j<=i;j++) { wspol[i][j]=(wspol[i-1][j-1]+wspol[i-1][j])%p; //cout<<i<<" po "<<j<<" = "<<wspol[i][j]<<"\n"; } } dp[0][0][0]=1; dp[0][0][1]=1; dp[0][0][2]=1; dp[0][0][3]=1; dp[1][0][0]=1; dp[1][1][1]=1; dp[1][1][2]=1; dp[1][1][3]=1; sum[1][0][0]=1; for(i=0;i<=k;i++) { for(j=0;j<=3;j++) sum[0][i][j]=1; } for(i=1;i<=k;i++) { for(j=0;j<=3;j++) sum[1][i][j]=1; } for(i=2;i<=n;i++) { for(j=1;j<=k;j++) { // x z lewej for(x=0;x<i;x++) { if((i==n)&&(j==k)) { // 0 // z lewej j z prawej mniej //dp[i][j][0]=(dp[i][j][0]+(((dp[x][j][2]*sum[i-x-1][j-1][1])%p)*wspol[i-1][x])%p)%p; a=dp[x][j][2]*sum[i-x-1][j-1][1]; // z lewej mniej z prawej j //dp[i][j][0]=(dp[i][j][0]+(((sum[x][j-1][2]*dp[i-x-1][j][1])%p)*wspol[i-1][x])%p)%p; a+=sum[x][j-1][2]*dp[i-x-1][j][1]; // oba j //dp[i][j][0]=(dp[i][j][0]+(((dp[x][j][2]*dp[i-x-1][j][1])%p)*wspol[i-1][x])%p)%p; a+=dp[x][j][2]*dp[i-x-1][j][1]; dp[i][j][0]=(dp[i][j][0]+wspol[i-1][x]*(a%p))%p; } // 1 // z lewej j-1 z prawej mniej lub równo j //dp[i][j][1]=(dp[i][j][1]+(((dp[x][j-1][3]*sum[i-x-1][j][1])%p)*wspol[i-1][x])%p)%p; a=dp[x][j-1][3]*sum[i-x-1][j][1]; // z lewej mniej niż j-1 z prawej j //dp[i][j][1]=(dp[i][j][1]+(((sum[x][j-2][3]*dp[i-x-1][j][1])%p)*wspol[i-1][x])%p)%p; a+=sum[x][j-2][3]*dp[i-x-1][j][1]; dp[i][j][1]=(dp[i][j][1]+wspol[i-1][x]*(a%p))%p; /* // 2 // z lewej mniej lub równo j z prawej j-1 dp[i][j][2]=(dp[i][j][2]+(((sum[x][j][2]*dp[i-x-1][j-1][3])%p)*wspol[i-1][x])%p)%p; // z lewej j z prawej mniej niż j-1 dp[i][j][2]=(dp[i][j][2]+(((dp[x][j][2]*sum[i-x-1][j-2][3])%p)*wspol[i-1][x])%p)%p; */ // 3 // z lewej j z prawej mniej //dp[i][j][3]=(dp[i][j][3]+(((dp[x][j][3]*sum[i-x-1][j-1][3])%p)*wspol[i-1][x])%p)%p; a=dp[x][j][3]*sum[i-x-1][j-1][3]; // z lewej mniej z prawej j //dp[i][j][3]=(dp[i][j][3]+(((sum[x][j-1][3]*dp[i-x-1][j][3])%p)*wspol[i-1][x])%p)%p; a+=sum[x][j-1][3]*dp[i-x-1][j][3]; // oba j-1 //dp[i][j][3]=(dp[i][j][3]+(((dp[x][j-1][3]*dp[i-x-1][j-1][3])%p)*wspol[i-1][x])%p)%p; a+=dp[x][j-1][3]*dp[i-x-1][j-1][3]; dp[i][j][3]=(dp[i][j][3]+wspol[i-1][x]*(a%p))%p; } dp[i][j][2]=dp[i][j][1]; //sum[i][j][0]=sum[i][j-1][0]+dp[i][j][0]; sum[i][j][1]=(sum[i][j-1][1]+dp[i][j][1])%p; sum[i][j][2]=(sum[i][j-1][2]+dp[i][j][2])%p; sum[i][j][3]=(sum[i][j-1][3]+dp[i][j][3])%p; //cout<<"dp["<<i<<"]["<<j<<"] [1]="<<dp[i][j][1]<<" [2]="<<dp[i][j][2]<<" [3]="<<dp[i][j][3]<<"\n"; } } cout<<dp[n][k][0]; return 0; } |
English