제출 #217822

#제출 시각아이디문제언어결과실행 시간메모리
217822tatyamLinear Garden (IOI08_linear_garden)C++17
100 / 100
593 ms2580 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define name3(a,b,c,d,...) d
#define rep1(a) for(ll i = 0; i < a; i++)
#define rep2(i,a) for(ll i = 0; i < a; i++)
#define rep(...) name3(__VA_ARGS__, rep3, rep2, rep1)(__VA_ARGS__)
#define rrep(a) for(ll i = a; i--; )
#define each(i,a) for(auto&& i : a)
#define all(a) begin(a), end(a)
template<class T, class U> bool chmin(T& a, const U& b){ if(a > b){ a = b; return 1; } return 0; }
template<class T, class U> bool chmax(T& a, const U& b){ if(a < b){ a = b; return 1; } return 0; }


ll m;
struct Modint{
    ll x = 0;
    Modint(){}
    Modint(ll a): x(a % m){}
    Modint operator+(Modint a) const { return Modint(*this) += a; }
    Modint& operator+=(Modint a){ x += a.x; if(x >= m) x -= m; return *this; }
};
int main(){
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    ll n;
    string s;
    cin >> n >> m >> s;
    Modint dp1[5][5][5] = {}, dp2[5][5][5] = {};
    dp2[2][2][2] = 1;
    bool flag = 1;
    each(c, s){
        rep(5) rep(j, 5) if(j - i < 3) rep(k, 5) if((k ^ flag) & 1 && dp1[i][j][k].x){
            if(k < 4) dp1[i][max(j, k + 1)][k + 1] += dp1[i][j][k];
            if(k) dp1[min(i, k - 1)][j][k - 1] += dp1[i][j][k];
            dp1[i][j][k] = 0;
        }
        rep(5) rep(j, 5) if(j - i < 3) rep(k, 5) if((k ^ flag) & 1 && dp2[i][j][k].x){
            if(k < 4 && c == 'P') dp2[i][max(j, k + 1)][k + 1] += dp2[i][j][k];
            if(k && c == 'P') dp1[min(i, k - 1)][j][k - 1] += dp2[i][j][k];
            if(k && c == 'L') dp2[min(i, k - 1)][j][k - 1] += dp2[i][j][k];
            dp2[i][j][k] = 0;
        }
        flag = !flag;
    }
    Modint ans = 0;
    rep(5) rep(j, 5) if(j - i < 3) rep(k, 5) ans += dp1[i][j][k];
    ans += 1;
    cout << ans.x << endl;
}
#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...
#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...
#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...
#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...