#include <algorithm> #include <limits> #include <map> #include <set> #include <sstream> #include <string> #include <vector> #include <iostream> #include <cstring> using namespace std; typedef unsigned long long ULL; const int N=1024; unsigned p, tdn[N][N], tl[N][16][2]; int dn(int n, int k) { if (k==0 || k==n) return 1; if (tdn[n][k]!=-1) return tdn[n][k]; int wyn=dn(n-1, k-1)+dn(n-1, k); if (p<=wyn) wyn-=p; return tdn[n][k]=wyn; } int licz(int n, int k, bool obie) { if (k<0 || n<k) return 0; if (k==0) return n==0 ? 1 : 0; if (n==0) return k==0 ? 1 : 0; if (n==1) return k==1 ? 1 : 0; if (n==2) { if (obie) return k==1 ? 2 : 0; if (k==1) return 1; if (k==2) return 1; return 0; } if (tl[n][k][obie]!=-1) return tl[n][k][obie]; int wyn=0; for (int i=0; i<n; ++i) { ULL w=0; if (obie) { w=(w+ULL(licz(i, k-1, true))*licz(n-1-i, k-1, true))%p; for (int kk=0; kk<k; ++kk) { w=(w+ULL(licz(i, k, true))*licz(n-1-i, kk, true))%p; w=(w+ULL(licz(i, kk, true))*licz(n-1-i, k, true))%p; } } else { for (int k2=0; k2<=k; ++k2) w=(w+ULL(licz(i, k-1, true))*licz(n-1-i, k2, false))%p; for (int k1=0; k1<k-1; ++k1) w=(w+ULL(licz(i, k1, true))*licz(n-1-i, k, false))%p; } wyn=(wyn+w*dn(n-1, i))%p; } return tl[n][k][obie]=wyn; } int liczW(int n, int k) { if (n==1) return k==0 ? 1 : 0; if (n==2) { if (k==1) return 2; return 0; } int wyn=0; for (int i=0; i<n; ++i) { ULL w=0; for (int k2=0; k2<=k; ++k2) w=(w+ULL(licz(i, k, false))*licz(n-1-i, k2, false))%p; for (int k1=0; k1<k; ++k1) w=(w+ULL(licz(i, k1, false))*licz(n-1-i, k, false))%p; wyn=(wyn+w*dn(n-1, i))%p; } return wyn; } int main() { memset(tdn, -1, sizeof(tdn)); memset(tl, -1, sizeof(tl)); int n, k; cin>>n>>k>>p; if (k<11) cout<<liczW(n, k)<<endl; else cout<<0<<endl; 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 | #include <algorithm> #include <limits> #include <map> #include <set> #include <sstream> #include <string> #include <vector> #include <iostream> #include <cstring> using namespace std; typedef unsigned long long ULL; const int N=1024; unsigned p, tdn[N][N], tl[N][16][2]; int dn(int n, int k) { if (k==0 || k==n) return 1; if (tdn[n][k]!=-1) return tdn[n][k]; int wyn=dn(n-1, k-1)+dn(n-1, k); if (p<=wyn) wyn-=p; return tdn[n][k]=wyn; } int licz(int n, int k, bool obie) { if (k<0 || n<k) return 0; if (k==0) return n==0 ? 1 : 0; if (n==0) return k==0 ? 1 : 0; if (n==1) return k==1 ? 1 : 0; if (n==2) { if (obie) return k==1 ? 2 : 0; if (k==1) return 1; if (k==2) return 1; return 0; } if (tl[n][k][obie]!=-1) return tl[n][k][obie]; int wyn=0; for (int i=0; i<n; ++i) { ULL w=0; if (obie) { w=(w+ULL(licz(i, k-1, true))*licz(n-1-i, k-1, true))%p; for (int kk=0; kk<k; ++kk) { w=(w+ULL(licz(i, k, true))*licz(n-1-i, kk, true))%p; w=(w+ULL(licz(i, kk, true))*licz(n-1-i, k, true))%p; } } else { for (int k2=0; k2<=k; ++k2) w=(w+ULL(licz(i, k-1, true))*licz(n-1-i, k2, false))%p; for (int k1=0; k1<k-1; ++k1) w=(w+ULL(licz(i, k1, true))*licz(n-1-i, k, false))%p; } wyn=(wyn+w*dn(n-1, i))%p; } return tl[n][k][obie]=wyn; } int liczW(int n, int k) { if (n==1) return k==0 ? 1 : 0; if (n==2) { if (k==1) return 2; return 0; } int wyn=0; for (int i=0; i<n; ++i) { ULL w=0; for (int k2=0; k2<=k; ++k2) w=(w+ULL(licz(i, k, false))*licz(n-1-i, k2, false))%p; for (int k1=0; k1<k; ++k1) w=(w+ULL(licz(i, k1, false))*licz(n-1-i, k, false))%p; wyn=(wyn+w*dn(n-1, i))%p; } return wyn; } int main() { memset(tdn, -1, sizeof(tdn)); memset(tl, -1, sizeof(tl)); int n, k; cin>>n>>k>>p; if (k<11) cout<<liczW(n, k)<<endl; else cout<<0<<endl; return 0; } |