답안 #535156

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
535156 2022-03-09T14:12:40 Z cig32 Linear Garden (IOI08_linear_garden) C++17
100 / 100
79 ms 38408 KB
#include "bits/stdc++.h"
using namespace std;
const int MAXN = 2e5 + 10;
const int MOD = 1e9 + 7;
//#define int long long
mt19937_64 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
int rnd(int x, int y) {
  int u = uniform_int_distribution<int>(x, y)(rng); return u;
}
int bm(int b, int p) { 
  if(p==0) return 1;
  int r = bm(b, p/2);
  if(p&1) return (((r*r) % MOD) * b) % MOD;
  return (r*r) % MOD;
}
int inv(int b) {
  return bm(b, MOD-2);
}
int f[MAXN];
int nCr(int n, int r) { 
  int ans = f[n]; ans *= inv(f[r]); ans %= MOD;
  ans *= inv(f[n-r]); ans %= MOD; return ans;
}

void precomp() { 
  f[0] = 1;
  for(int i=1; i<MAXN; i++) f[i] = (f[i-1] * i) % MOD;
}

void solve(int tc) {
  int n, m;
  cin >> n >> m;
  string s;
  cin >> s;
  int dp[n+1][3][3];
  for(int i=0; i<=n; i++) {
    for(int j=0; j<3; j++) {
      for(int k=0; k<3; k++) {
        dp[i][j][k] = 0;
      }
    }
  }
  dp[1][0][1] = 1;
  dp[1][1][0] = 1;
  for(int i=2; i<=n; i++) {
    for(int j=0; j<3; j++) {
      for(int k=0; k<3; k++) {
        //final = L
        if(k > 0 && j < 2) {
          dp[i][j][k] += dp[i - 1][j + 1][k - 1];
          if(j == 0) dp[i][j][k] += dp[i - 1][0][k - 1];
          dp[i][j][k] %= m;
        }
        //final = P
        if(k < 2 && j > 0) {
          dp[i][j][k] += dp[i - 1][j - 1][k + 1];
          if(k == 0) dp[i][j][k] += dp[i - 1][j - 1][0];
          dp[i][j][k] %= m;
        }
      }
    }
  }
  dp[0][0][0] = 1;
  int ans = 0;
  int ma = 0, mi = 0; // take absolute value
  for(int i=0; i<n; i++) {
    if(s[i] == 'P') {
      int new_ma = max(0, ma - 1);
      int new_mi = mi + 1;
      for(int j=0; j<3; j++) {
        for(int k=0; k<3; k++) {
          if(j + new_ma <= 2 && k + new_mi <= 2) {
            ans += dp[n - i - 1][j][k];
            ans %= m;
          }
        }
      }
      ma = ma + 1;
      mi = max(0, mi - 1);
      if(ma > 2) break;
    }
    else {
      ma = max(0, ma - 1);
      mi = mi + 1;
      if(mi > 2) break;
    }
  }
  cout << (ans + 1) % m << '\n';
}
int32_t main(){
  precomp();
  ios::sync_with_stdio(0); cin.tie(0);
  int t = 1; //cin >> t;
  for(int i=1; i<=t; i++) solve(i);
} 
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1092 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1100 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 972 KB Output is correct
2 Correct 2 ms 1100 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1100 KB Output is correct
2 Correct 2 ms 1100 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1100 KB Output is correct
2 Correct 2 ms 1228 KB Output is correct
3 Correct 2 ms 1228 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 1740 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 1868 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 3276 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 3788 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 12360 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 15712 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 19680 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 23792 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 71 ms 38408 KB Output is correct
2 Correct 79 ms 38368 KB Output is correct
3 Correct 79 ms 38304 KB Output is correct