#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;
}
ll binpow(int a, int x) {
//calcular a^x
ll res=1;
ll exp=a;
for (int i=0; i<31; i++) {
if (x&(1<<i)) {
res = (res*exp) % MOD;
}
exp *= exp;
exp %= MOD;
}
return res;
}
int countReplacement(int n, int A[]) {
bool can = valid(n, A);
if (!can) return 0;
vector<int> a(n), b(n);
int mn = 1e9;
int mx=0;
for(int i=0; i<n; i++) {
a[i] = A[i];
mn = min(mn, a[i]);
mx = max(mx, a[i]);
}
shift(a);
ll ans=1;
vector<pii> p;
for (int i=0; i<n; i++) {
if (a[i] != i+1) {
p.push_back({a[i], i+1});
}
}
sort(p.begin(), p.end());
int last = n+1;
int m = p.size();
for (int i=0; i<m; i++) {
int exp = p[i].first-last;
ans = (ans*binpow(m-i, exp)) % MOD;
}
if (mn>n) {
ans = (ans*n)%MOD;
}
return ans;
}