Cod sursa(job #466922)
#include <cstdio>
#include <algorithm>
#include <vector>
#include <ctime>
#include <cstring>
#include <stdlib.h>
#define MAXN 300010
#define FOR(i,a,b) for(int (i) = (a);(i) <= (b);++(i) )
using namespace std;
int A[2 * MAXN + 100], right, x, m, r1, px, py, sum, gr1[MAXN], gr2[MAXN], cnt, nr, ok, P;
int cl[2 * MAXN + 100];
int main ()
{
freopen ("congr.in", "r", stdin);
freopen ("congr.out", "w", stdout);
scanf ("%d\n", &P);
const int n = 2 * P - 1;
FOR (i, 1, n)
{
scanf ("%d", &A[i]);
if (A[i] > P) A[i] %= P;
cl[i] = i;
}
m = n;
srand (time (NULL));
while (nr < P)
{
++nr;
x = rand () % m + 1;
gr1[nr] = cl[x];
swap (cl[x], cl[m]);
--m;
}
FOR (i, 1, m) gr2[i] = cl[i];
FOR (i, 1, P) sum += A[gr1[i]];
// ok = 1;
while (!ok)
{
sum %= P;
px = rand () % P + 1;
px = rand () % m + 1;
sum = (sum - A[gr1[px]] + A[gr2[py]]) % P;
swap (gr1[px], gr2[py]);
if (sum == 0) ok = 1;
}
sum = 0;
FOR (i, 1, P)
printf ("%d ", gr1[i]);
return 0;
}