#include <bits/stdc++.h>
#include "gondola.h"
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int MOD = 1e9+9;
void rotate(int k, vector<int> &a) {
vector<int> b = a;
int n = a.size();
for (int i=0; i<n; i++) {
b[(i+k)%n] = a[i];
}
a = b;
}
void shift(vector<int> &a) {
int n = a.size();
int mn = a[0];
for (int i=0; i<n; i++) {
mn = min(mn, a[i]);
}
int idx=-1;
for (int i=0; i<n; i++) {
if (a[i]==mn) {
idx = i;
break;
}
}
int k;
if (mn-1<idx) {
//mn-1 es el indice donde deberia estar
k = n-(idx+1)+mn;
}
else {
k = mn-1-idx;
}
//cout << k << " " << mn << "\n";
rotate(k, a);
}
int valid(int n, int A[]) {
vector<int> bf, after, a(n);
for (int i=0; i<n; i++) {
a[i] = A[i];
}
map<int, int> mp;
int mn = a[0];
for (int i=0; i<n; i++) {
mp[a[i]]++;
mn = min(mn, a[i]);
}
for (auto [x, val] : mp) {
if (val>=2) {
return 0;
}
}
shift(a);
for (int i=0; i<n; i++) {
if (a[i]>n) continue;
if (a[i] != i+1) return 0;
}
return 1;
}
int replacement(int n, int A[], int replacementSeq[]) {
vector<int> a(n);
for (int i=0; i<n; i++) {
a[i] = A[i];
}
int mn = a[0];
for (int i=0; i<n; i++) {
mn = min(mn, a[i]);
}
int idx=-1;
for (int i=0; i<n; i++) {
if (a[i]==mn) {
idx = i;
break;
}
}
int k;
if (mn-1<idx) {
//mn-1 es el indice donde deberia estar
k = n-(idx+1)+mn;
}
else {
k = mn-1-idx;
}
//cout << k << " " << mn << "\n";
rotate(k, a);
//Rotado jiji
vector<pii> b;
for (int i=0; i<n; i++) {
if (a[i] <= n) continue;
b.push_back({a[i], i+1});
}
sort(b.begin(), b.end());
int last = n+1;
int m = b.size();
int j=0;
for (int i=0; i<m; i++) {
replacementSeq[j] = b[i].second;
j++;
while (last<b[i].first) {
replacementSeq[j] = last;
j++;
last++;
}
last = b[i].first+1;
}
return j;
}
int n;
int memo[101][101][101];
int change;
vector<int> b;
int f(int i, int j, int k) {
int mx = max({i, j, k});
if (mx==change) {
if (i==b[0] && j==b[1] && k==b[2]) return 1;
else return 0;
}
//cout << i << " " << j << " " << k << endl;
if (memo[i][j][k] != -1) return memo[i][j][k];
int result;
if (mx<=n) {
int caso1 = f(n+1, j, k);
int caso2 = f(i, n+1, k);
int caso3 = f(i, j, n+1);
result = caso1+caso2;
result %= MOD;
result += caso3;
}
else {
int caso1 = f(mx+1, j, k);
int caso2 = f(i, mx+1, k);
int caso3 = f(i, j, mx+1);
result = caso1+caso2;
result %= MOD;
result += caso3;
}
result %= MOD;
return memo[i][j][k] = result;
}
int countReplacement(int N, int A[]) {
n = N;
bool can = valid(n, A);
if (!can) return 0;
vector<int> a(n);
change = 0;
b.clear();
memset(memo, -1, sizeof(memo));
for(int i=0; i<n; i++) {
a[i] = A[i];
change = max(change, a[i]);
}
shift(a);
vector<int> mis;
for (int i=0; i<n; i++) {
if (a[i] != i+1) {
b.push_back(a[i]);
mis.push_back(i+1);
}
}
for (int i=0; i<n; i++) {
if (a[i] == i+1) {
while (b.size()<3) {
b.push_back(a[i]);
mis.push_back(a[i]);
}
}
}
int cnt = f(mis[0], mis[1], mis[2]);
return cnt;
}