#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 eliminados;
vector<int> a;
int f(vector<int> b, int c) {
int n = b.size();
if (c==eliminados) {
int B[51];
for (int i=0; i<n; i++) {
B[i] = b[i];
}
int can = valid(n, B);
if (!can) return 0;
if (a==b) return 1;
return 0;
}
int mx=0;
for (int i=0; i<n; i++) {
mx = max(mx, b[i]);
}
int ans=0;
for (int i=0; i<n; i++) {
int og = b[i];
b[i] = mx+1;
ans += f(b, c+1);
ans %= MOD;
b[i] = og;
}
return ans;
}
int countReplacement(int n, int A[]) {
bool can = valid(n, A);
if (!can) return 0;
a.assign(n, 0);
int mx=0;
for (int i=0; i<n; i++) {
a[i] = A[i];
mx = max(mx, a[i]);
}
eliminados = mx-n;
shift(a);
vector<int> b(n);
for (int i=0; i<n; i++) {
b[i] = i+1;
}
int cnt = f(b, 0);
return cnt;
}