# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1182637 | sano | Gondola (IOI14_gondola) | C++20 | 0 ms | 0 KiB |
//#pragma GCC optimize("O3")
//#pragma GCC target("tune=native")
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
//#include "gondola.h"
#include<iostream>
#include<vector>
#include<queue>
#include<deque>
#include<string>
#include<fstream>
#include<algorithm>
#include <iomanip>
#include<map>
#include <set>
#include <unordered_map>
#include <stack>
#include <unordered_set>
#include <cmath>
#include <cstdint>
#include <cassert>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
#define shit short int
#define ll long long
//#define int ll
#define For(i, n) for(int i = 0; i < (int)n; i++)
#define ffor(i, a, n) for(int i = (int)a; i < (int)n; i++)
#define rfor(i, n) for(int i = (int)n; i >= (int)0; i--)
#define rffor(i, a, n) for(int i = (int)n; i >= (int)a; i--)
#define vec vector
#define ff first
#define ss second
#define pb push_back
#define pii pair<int, int>
#define NEK 2000000000
#define mod 1000000009
#define mod2 1000000009
#define rsz resize
#define prv1 43
#define prv2 47
#define D 8
#define trav(a,x) for (auto& a: x)
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define all(x) (x).begin(), (x).end()
#define sig 0.0000001
using namespace std;
//using namespace __gnu_pbds;
//template <typename T1, typename T2>
//using indexed_set = tree<pair<T1, T2>, null_type, less<pair<T1, T2>>, rb_tree_tag, tree_order_statistics_node_update>;
int valid(int n, int p1[]) {
vec<ll> p;
ll minipoz = 0;
set<ll> je;
For(i, n) {
if (p1[i] < p1[minipoz]) minipoz = i;
je.insert(p1[i]);
}
if (je.size() != n) return 0;
ffor(i, minipoz, n) {
p.push_back(p1[i]);
}
For(i, minipoz) {
p.push_back(p1[i]);
}
ll prv = p[0];
if (prv > n) return 1;
For(i, n) {
if (p[i] > n) continue;
if (p[i] != prv + i) {
return 0;
}
}
return 1;
}
int replacement(int n, int p1[], int r1[]) {
vec<int> p;
int minipoz = 0;
For(i, n) {
if (p1[i] < p1[minipoz]) minipoz = i;
}
ffor(i, minipoz, n) {
p.push_back(p1[i]);
}
For(i, minipoz) {
p.push_back(p1[i]);
}
int prv = p[0];
vec<pii> d;
For(i, n) {
if (p[i] <= n) continue;
d.push_back({ p[i], (i + prv - 1) % n + 1 });
}
sort(all(d));
int som = 0;
For(i, d.size()) {
r1[som] = d[i].ss;
som++;
while (som + n + 1 <= d[i].ff) {
r1[som] = n + som;
som++;
}
}
return som;
}
ll umocni(ll a, ll b) {
ll vys = 1;
while (b) {
if (b % 2 == 1) {
vys *= a;
vys %= mod;
}
a *= a;
a %= mod;
b /= 2;
}
return vys;
}
int countReplacement(int n, int p1[]) {
int mojo = valid(n, p1);
if (mojo == 0) return 0;
vec<ll> d;
For(i, n) {
if (p1[i] <= n) continue;
d.push_back(p1[i]);
}
sort(all(d));
int k = 1;
if (d.size() == n) {
k = n;
}
sort(all(d));
ll pr = n + 1;
ll vys = 1;
ll disize = d.size();
For(i, d.size()) {
ll mozem = (d[i] - pr);
mozem %= mod;
vys *= umocni(disize - i, mozem);
vys %= mod;
pr = d[i] + 1;
}
return (vys * k) % mod;
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
int t;
t = 1;
For(i, t) {
int n; cin >> n;
int p[100];
For(i, n) cin >> p[i];
cout << countReplacement(n, p) << '\n';
}
return 0;
}