Cod sursa(job #203796)
#include <stdio.h>
#define FIN "curcubeu.in"
#define FOUT "curcubeu.out"
#define min(a,b) a<b ? a:b
#define max(a,b) a>b ? a:b
#define LL long long
#define N_MAX 1010000
int N;
int sol[N_MAX];
int s[N_MAX];
LL A[N_MAX];
LL B[N_MAX];
LL C[N_MAX];
int minim,maxim;
int main()
{
int i;
freopen(FIN,"rt",stdin);
scanf("%d %d %d %d", &N, &A[1], &B[1], &C[1]);
for (i=2;i<N;++i)
{
A[i]=(A[i-1]*i)%N;
B[i]=(B[i-1]*i)%N;
C[i]=(C[i-1]*i)%N;
}
for (i=N-1;i>0;--i)
{
minim=min(A[i],B[i]);
maxim=max(A[i],B[i]);
while (minim<=maxim)
{
if (sol[minim]==0)
{
s[minim]=maxim+1;
sol[minim++]=C[i];
}
else
minim=s[minim];
}
}
freopen(FOUT,"wt",stdout);
for (i=1;i<N;++i)
printf("%d\n", sol[i]);
return 0;
}