Submission #580096

#TimeUsernameProblemLanguageResultExecution timeMemory
580096Do_you_copyLinear Garden (IOI08_linear_garden)C++17
100 / 100
183 ms2416 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][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 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...