#include "gondola.h"
#include <bits/stdc++.h>
#define f first
#define s second
#define pb push_back
#define mp make_pair
#define ll long long
using namespace std;
const ll mod=1e9+9;
//int gondolaSequence[100001];
//int replacementSequence[250001];
int valid(int n, int inputSeq[])
{
int a[2*n+5];
for (int i=0; i<n; i++) a[i]=inputSeq[i];
map <ll,ll> m;
m.clear();
bool ok=0;
int x,y;
x=a[0]; y=0;
for (int i=0; i<n; i++){
m[a[i]]++;
if (m[a[i]]>1){
ok=1; break;
}
if (x>a[i]){
x=a[i]; y=i;
}
}
if (ok) return 0;
if (x>n) return 1;
for (int i=0; i<n; i++) a[i+n]=a[i];
for (int i=y; i<y+n; i++){
if (x>n) x-=n;
if (a[i]>n || a[i]==x){
x++; continue;
}
ok=1; break;
}
if (ok) return 0;
return 1;
}
//----------------------
int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
int a[2*n+5];
for (int i=0; i<n; i++) a[i]=gondolaSeq[i];
vector <pair<int,int> > p;
int x=n+1,y;
for (int i=0; i<n; i++){
if (x>a[i]){
x=a[i]; y=i;
}
}
int b[2*n+5];
for (int i=0; i<n; i++) b[i]=a[i];
for (int i=0; i<n; i++) b[i+n]=b[i];
if (x>n){
b[0]=1; y=0; x=1;
}
for (int i=y; i<y+n; i++){
if (x>n) x-=n;
if (b[i]>n || b[i]==x){
b[i]=x; if (i>=n) b[i-n]=x; x++; continue;
}
}
// for (int i=0; i<n; i++) cout<<b[i]<<" "; cout<<endl;
p.clear();
for (int i=0; i<n; i++){
if (a[i]<=n) continue;
p.pb(mp(a[i],b[i]));
}
sort(p.begin(),p.end());
int l=0;
if (p.size()==0) return l;
//replacementSeq[0]=p[0].s;
x=n+1;
for (int i=0; i<p.size(); i++){
y=p[i].f; int z=p[i].s;
while (y>=x){
replacementSeq[l]=z; l++; z=x; x++;
}
}
return l;
}
//----------------------
ll binpow(int a,int b){
ll res=1;
while (b>0){
if (b%2==1) res=(res*a)%mod;
b/=2;
a=(a*a)%mod;
}
return res;
}
int countReplacement(int n, int inputSeq[])
{
if (valid(n,inputSeq)==0) return 0;
int a[2*n+5];
for (int i=0; i<n; i++) a[i]=inputSeq[i];
int x=0;
vector <ll> v;
v.clear();
for (int i=0; i<n; i++){
if (a[i]>n) v.pb(a[i]);
}
sort(v.begin(),v.end());
x=n+1; int k=v.size(); ll ans=1,z=0;
for (int i=0; i<v.size(); i++){
int y=v[i]-x;
if (k*y==0) z=1; else
z=binpow(k,y);
// cout<<y<<" "<<k<<z<<endl;
ans=(ans*z)%mod;
k--; x=v[i];
}
bool ok=0;
for (int i=0; i<n; i++){
if (a[i]<=n) ok=1;
}
if (!ok) ans=(ans*n)%mod;
return ans;
}