This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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][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][j][k + 4][0] + dp[i2][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 <= 7; ++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();
}
Compilation message (stderr)
linear_garden.cpp: In function 'int main()':
linear_garden.cpp:107:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
107 | freopen(taskname".txt", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |