Pagini recente » return_of_the_troll | Monitorul de evaluare | Profil balazstasi | Cod sursa (job #1749077) | Cod sursa (job #657940)
Cod sursa(job #657940)
#include <cstdio>
#include <algorithm>
#define NMAX 1000001
using namespace std;
int n,a[NMAX],b[NMAX],c[NMAX],PR[NMAX],v[NMAX],i,x;
inline int rad(int x) {
int p,y;
for (p=x;p!=PR[p];p=PR[p]);
for (;x!=PR[x];) {
y=PR[x];
PR[x]=p;
x=y;
}
return p;
}
inline void unite(int x,int y) {
if (x>y) PR[y]=x;
else PR[x]=y;
}
int main () {
freopen ("curcubeu.in", "r", stdin);
freopen ("curcubeu.out", "w", stdout);
scanf ("%d%d%d%d", &n, &a[1], &b[1], &c[1]);
PR[1]=1;PR[n]=n;
if (a[1]>b[1]) swap(a[1],b[1]);
for (i=2;i<n;i++) {
a[i]=(1LL*a[i-1]*i)%n;
b[i]=(1LL*b[i-1]*i)%n;
c[i]=(1LL*c[i-1]*i)%n;
if (a[i]>b[i]) swap(a[i],b[i]);
PR[i]=i;
}
for (i=n-1;i>=1;i--)
for (a[i]=rad(a[i]);a[i]<=b[i];a[i]=rad(a[i])) {
v[a[i]]=c[i];
unite(rad(a[i]),rad(a[i]+1));
}
for (i=1;i<n;i++)
printf ("%d\n", v[i]);
return 0;
}