Cod sursa(job #86040)
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define MP make_pair
#define PB push_back
const int NMAX = 1 << 20;
int N, A, B, C;
vector <pair <int, pair <int, int> > > V[NMAX];
priority_queue <pair <int, pair <int, int> > > H;
void read(void) {
FILE *fin = fopen("curcubeu.in", "rt");
fscanf(fin, " %d", &N);
fscanf(fin, " %d %d %d", &A, &B, &C);
fclose(fin);
}
void numbers(void) {
int i;
for (i = 1; i < N; ++i) {
V[ min(A, B) ].PB( MP( i, MP( max(A, B), C) ) );
A = ((long long) A * (i + 1)) % N;
B = ((long long) B * (i + 1)) % N;
C = ((long long) C * (i + 1)) % N;
}
}
void write(void) {
FILE *fout = fopen("curcubeu.out", "wt");
int i, j;
for (i = 1; i < N; ++i) {
while (!H.empty() && H.top().second.first < i)
H.pop();
for (j = 0; j < (int) V[i].size(); ++j)
H.push( V[i][j] );
if (H.empty())
fprintf(fout, "0\n");
else
fprintf(fout, "%d\n", H.top().second.second);
}
fclose(fout);
}
int main(void) {
// printf("%d\n", sizeof(V));
// printf("%d\n", sizeof( pair <int, pair <int, int> > ));
read();
numbers();
write();
return 0;
}