Cod sursa(job #320264)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 4 iunie 2009 10:35:10
Problema Curcubeu Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>   
  
const int NMAX = 10000;
  
int n;   
int a[NMAX], b[NMAX], c[NMAX];   
int v[NMAX], skip[NMAX];   
  
int next ( int k )  {   
    if (k >= n)   
        return k;   
    if (skip[k] != k) {   
        int nx, aux, r;   
        for (nx = k; nx < n && skip[nx] != nx; nx = skip[nx]);   
        for (r = k; r < n && skip[r] != r; aux = skip[r], skip[r] = nx, r = aux);   
        return nx;   
    } else {   
        return k;   
    }   
}   
  
int main() {   
    freopen("curcubeu.in","rt",stdin);   
    freopen("curcubeu.out","wt",stdout);   
    scanf("%d %d %d %d",&n,&a[1],&b[1],&c[1]);   
    for (int i = 2; i < n; ++i) {   
        a[i] = ((long long)a[i-1] * i) % n;   
        b[i] = ((long long)b[i-1] * i) % n;   
        c[i] = ((long long)c[i-1] * i) % n;   
    }   
    --n;   
  
    for (int i = 0; i < n; ++i) skip[i] = i;   
    for (int k = n; k > 0; --k) {   
        if (b[k] < a[k])   
            a[k] ^= b[k] ^= a[k] ^= b[k];   
        int i;   
        for (i = next(a[k]-1); i < b[k]; i = next(i)) {   
            v[i] = c[k];   
            skip[i] = next(i+1);   
        }   
    }   
  
    for (int i = 0; i < n; ++i)   
        printf("%d\n",v[i]);   
    return 0;   
}