제출 #1131221

#제출 시각아이디문제언어결과실행 시간메모리
1131221huutuanFestivals in JOI Kingdom 2 (JOI23_festival2)C++20
37 / 100
1733 ms83936 KiB
#include <bits/stdc++.h>

using namespace std;

const int N=110;
int n, mod, f[N*2][N][N][2][2][2], g[N*2][N];

void add(int &x, int y){
   x=x+y>=mod?x+y-mod:x+y;
}

int32_t main(){
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr);
   cin >> n >> mod;
   // int ans=0;
   g[n*2][0]=1;
   for (int i=n*2; i>=1; --i) for (int j=n; j>=0; --j){
      { // add (
         if (j) add(g[i-1][j-1], g[i][j]);
      }
      { // add )
         add(g[i-1][j+1], 1ll*g[i][j]*(j+1)%mod);
      }
   }
   // k: so cai mo ngoac dung sau cai cuoi cung cua type 2
   f[0][0][0][0][0][0]=1;
   for (int i=0; i<n*2; ++i) for (int j=0; j<=n; ++j) for (int k=0; k<=n; ++k) for (int d=0; d<2; ++d){
      // cai ngoac cua type 1 co dung truoc cai cuoi cung duoc match cua type 2 khong
      // dung truoc / khong co = 0
      // dung sau = 1
      { // add (
         // la cai dau tien
         add(f[i+1][j][k][d][1][1], f[i][j][k][d][0][0]);
         // khong phai cai dau tien
         add(f[i+1][j+1][k+1][d][0][1], f[i][j][k][d][0][1]);
         add(f[i+1][j+1][k+1][d][1][1], f[i][j][k][d][1][1]);
      }
      { // add )
         // match voi cai ngoac cua type 1
         // case 1: dung truoc
         if (d) add(f[i+1][j][k][d-1][0][0], f[i][j][k][d][0][1]);
         // case 2: dung sau
         add(f[i+1][j][0][d][0][0], f[i][j][k][d][1][1]);
         // khong match voi type 1
         if (j){
            // case 1: dung truoc
            add(f[i+1][j-1][k][d][0][0], 1ll*f[i][j][k][d][0][0]*(j-k)%mod);
            add(f[i+1][j-1][k][d][0][1], 1ll*f[i][j][k][d][0][1]*(j-k)%mod);
            add(f[i+1][j-1][k][d][1][1], 1ll*f[i][j][k][d][1][1]*(j-k)%mod);
            // case 2: dung sau
            if (d==0){
               add(f[i+1][j-1][0][d+1][0][0], 1ll*f[i][j][k][d][0][0]*k%mod);
               add(f[i+1][j-1][0][d+1][0][1], 1ll*f[i][j][k][d][0][1]*k%mod);
               add(f[i+1][j-1][0][d+1][0][1], 1ll*f[i][j][k][d][1][1]*k%mod);
            }else{
               // ans+=f[i][j][k][d][0][0]*k*g[i+1][j-1];
               // ans+=f[i][j][k][d][0][1]*k*g[i+1][j];
               // ans+=f[i][j][k][d][1][1]*k*g[i+1][j];
            }
         }
      }
   }
   // ans+=f[n*2][0][0][1][0][0];
   // cout << ans << '\n';
   // cout << g[0][0] << '\n';
   // cout << f[n*2][0][0][0][0][0] << '\n';
   cout << (g[0][0]-f[n*2][0][0][0][0][0]+mod)%mod << '\n';
   return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...