| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1282612 | repmann | Gondola (IOI14_gondola) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define ll long long
//#include "gondola.h"
using namespace std;
const int MOD = 1000000009;
inline int mul(ll x, ll y) {return ((x % MOD) * (y % MOD)) % MOD;}
inline int Power(ll x, ll y)
{
int ret = 1;
while(y)
{
if(y & 1) ret = mul(ret, x);
x = mul(x, x);
y >>= 1;
}
return ret;
}
int N;
int A[200000];
int valid(int n, int a[])
{
N = n;
set <int> SET;
for(int i = 0; i < N; i++) if(!SET.insert(a[i]).second) return 0;
for(int i = 0; i < N; i++) A[i] = A[i + N] = a[i];
int index = 0;
for(int i = 1; i < N; i++) if(A[i] < A[index]) index = i;
if(A[index] > N) return 1;
for(int i = index; i < (index + N); i++)
{
if((A[i] <= N) && (A[index] != (A[i] - (i - index)))) return 0;
}
return 1;
}
int replacement(int n, int a[], int O[])
{
if(!valid(n, a)) return 0;
N = n;
for(int i = 0; i < N; i++) A[i] = A[i + N] = a[i];
int index = 0;
for(int i = 1; i < N; i++) if(A[i] < A[index]) index = i;
if(A[index] <= N)
{
index -= A[index] - 1;
index += (index < 0) * N;
}
else index = 0;
vector <pair <int, int>> V;
for(int i = 0; i < N; i++)
{
if(A[i + index] > N) V.push_back({A[i + index], i + 1});
}
sort(V.begin(), V.end());
int cnt = N, M = 0;
for(pair <int, int> p : V)
{
cnt++;
O[M++] = p.second;
while(cnt < p.first)
{
O[M++] = cnt;
cnt++;
}
}
return M;
}
int countReplacement(int n, int a[])
{
if(!valid(n, a)) return 0;
N = n;
int sol = 1;
vector <int> V;
for(int i = 0; i < N; i++)
{
if(a[i] > N) V.push_back(A[i]);
}
sort(V.begin(), V.end());
for(int i = V.size() - 2; i >= 0; i--)
{
sol = mul(Power(V.size() - 1 - i, V[i + 1] - V[i] - 1), sol);
}
sol = mul(Power(V.size(), V.front() - N - 1), sol);
return sol;
}
int main()
{
int n;
cin >> n;
int a[n], o[100];
for(int i = 0; i < n; i++) cin >> a[i];
cout << valid(n, a) << '\n';
int sz = replacement(n, a, o);
for(int i = 0; i < sz; i++) cout << o[i] << " \n"[i == (sz - 1)];
cout << countReplacement(n, a) << '\n';
}
