제출 #580091

#제출 시각아이디문제언어결과실행 시간메모리
580091Do_you_copyLinear Garden (IOI08_linear_garden)C++14
2 / 100
176 ms2288 KiB
#include <bits/stdc++.h>
#define taskname "test"
#define fi first
#define se second
#define pb push_back
#define faster ios_base::sync_with_stdio(0); cin.tie(0);
using namespace std;

using ll = long long;
using pii = pair <int, int>;

ll min(const ll &a, const ll &b){
    return (a < b) ? a : b;
}

ll max(const ll &a, const ll &b){
    return (a > b) ? a : b;
}

const ll Mod = 1000000007;
const int maxN = 1e6 + 1;
int n, m;
string s;
ll dp[2][7][7][2];
pii convert[7];
//dp[cur_pos][range][last_value][is_equal_to_previous]

void cnv(int i){
    convert[0] = {-2, -1};
    convert[1] = {-1, 0};
    convert[2] = {0, 1};
    convert[3] = {1, 2};
    convert[4] = {-2, 0};
    convert[5] = {-1, 1};
    convert[6] = {0, 2};
}

void Add1(int i, int j){
    int i1 = i % 2;
    int i2 = i1 ^ 1;
    for (int k = convert[j].fi; k <= convert[j].se; ++k){
        if (s[i - 1] == 'L'){
            dp[i1][j][k + 3][1] = dp[i2][j][k + 2][1];
            dp[i1][j][k + 3][0] = dp[i2][j][k + 2][0] + dp[i2 - 1][j][k + 4][0];
        }
        else{
            dp[i1][j][k + 3][1] = dp[i2][j][k + 4][1];
            dp[i1][j][k + 3][0] = dp[i2][j][k + 2][0] + dp[i2 - 1][j][k + 4][0] + dp[i2 - 1][j][k + 2][1];
        }
        dp[i1][j][k + 3][1] %= m; dp[i1][j][k + 3][0] %= m;
    }
}

void Add2(int i, int j){
    int i1 = i % 2;
    int i2 = i1 ^ 1;
    for (int k = convert[j].fi; k <= convert[j].se; ++k){
        if (s[i - 1] == 'L'){
            dp[i1][j][k + 3][1] = dp[i2][j][k + 2][1];
            dp[i1][j][k + 3][0] = dp[i2][j][k + 2][0] + dp[i2][j][k + 4][0];
            if (k == convert[j].se){
                dp[i1][j][k + 3][1] += dp[i2][j - 4][k + 2][1];
                dp[i1][j][k + 3][0] += dp[i2][j - 4][k + 2][0];
            }
            if (k == convert[j].fi){
                dp[i1][j][k + 3][0] += dp[i2][j - 3][k + 4][0];
            }
        }
        else{
            dp[i1][j][k + 3][1] = dp[i2][j][k + 4][1];
            dp[i1][j][k + 3][0] = dp[i2][j][k + 2][0] + dp[i2][j][k + 4][0] + dp[i2][j][k + 2][1];
            if (k == convert[j].se){
                dp[i1][j][k + 3][0] += dp[i2][j - 4][k + 2][0] + dp[i2][j - 4][k + 2][1];
            }
            if (k == convert[j].fi){
                dp[i1][j][k + 3][0] += dp[i2][j - 3][k + 4][0];
                dp[i1][j][k + 3][1] += dp[i2][j - 3][k + 4][1];
            }
        }
        dp[i1][j][k + 3][1] %= m; dp[i1][j][k + 3][0] %= m;
    }
}

void Init(){
    cin >> n >> m;
    cin >> s;
    if (s[0] == 'L') dp[1][2][4][1] = 1;
    else dp[1][1][2][1] = dp[1][2][4][0] = 1;
    for (int i = 1; i <= n; ++i) cnv(i);
    for (int i = 2; i <= n; ++i){
        for (int j = 0; j < 4; ++j) Add1(i, j);
        for (int j = 4; j < 7; ++j) Add2(i, j);
    }
    ll ans = 0;
    for (int j = 0; j < 7; ++j){
        for (int k = convert[j].fi; k <= convert[j].se; ++k){
            ans += dp[n % 2][j][k + 3][0] + dp[n % 2][j][k + 3][1];
            ans %= m;
        }
    }
    cout << ans;
}

int main(){
    if (fopen(taskname".txt", "r")){
        freopen(taskname".txt", "r", stdin);
    }
    faster
    //freopen(taskname.inp, "r", stdin)
    //freopen(taskname.out, "w", stdout)
    Init();
}

컴파일 시 표준 에러 (stderr) 메시지

linear_garden.cpp: In function 'int main()':
linear_garden.cpp:106:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  106 |         freopen(taskname".txt", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...