Cod sursa(job #728562)
#include<cstdio>
#include<algorithm>
#define ll long long
#define dim 1000007
using namespace std;
long long A[dim],B[dim],C[dim],N,i,j,T[dim],t,a,b,sol[dim];
void calculate () {
T[1]=1; T[N]=N;
for(int i=2; i<N ; ++i ){
T[i]=i;
A[i]= (ll) (A[i-1]*i )%N;
B[i]= (ll) (B[i-1]*i )%N;
C[i]= (ll) (C[i-1]*i )%N;
if(A[i]>B[i])
swap( A[i] , B[i] );
}
}
inline int tata(int x) {
int y , r ;
y=r=x ;
for (;r!=T[r];r=T[r]);
while( x != T[x] ){
t=T[x];
T[x]=r;
x=t;
}
return r;
}
inline void uon(int x,int y){
if(x>y)
T[y]=x;
else
T[x]=y;
}
void solve () {
for(int i=N-1 ; i>=1 ; --i ) {
for(A[i]=tata(A[i]) ; A[i]<=B[i] ; A[i]=tata(A[i])){
sol[A[i]]=C[i];
uon(tata(A[i]),tata(A[i]+1));
}
}
for(int i=1 ; i<N ; ++i )
printf("%lld\n",sol[i]);
}
int main (){
freopen("curcubeu.in","r",stdin);
freopen("curcubeu.out","w",stdout);
scanf("%d%d%d%d",&N , &A[1], &B[1], &C[1]);
calculate();
if(A[1]>B[1])
swap( A[1] , B[1] );
solve();
return 0;
}