Cod sursa(job #85370)

Utilizator astronomyAirinei Adrian astronomy Data 21 septembrie 2007 10:59:43
Problema Curcubeu Scor Ascuns
Compilator c Status done
Runda Marime 1.12 kb
#include <stdio.h>

#define MAX_N 1000100
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MIN(a,b) ((a) < (b) ? (a) : (b))

int N, A[MAX_N], B[MAX_N], C[MAX_N], next[MAX_N], cul[MAX_N];

int get_next(int x)
{
    int xx = x, aux;
    for(; cul[next[x]]; x = next[x]) ;
    for(; cul[next[xx]]; aux = xx, xx = next[xx], next[aux] = x) ;
    return x;
}

void baga(int a, int b, int c)
{
    int i;

    for(i = get_next(a); i <= b; i = get_next(i+1))
        cul[i] = c, next[i] = next[b+1];
}

int main(void)
{
    freopen("curcubeu.in", "rt", stdin);
    freopen("curcubeu.out", "wt", stdout);

    int i, a1, b1, c1;

    scanf("%d %d %d %d\n", &N, &a1, &b1, &c1);
    
    for(i = 1; i <= N; i++)
        next[i] = i;

    for(A[1] = a1, B[1] = b1, C[1] = c1, i = 2; i < N; i++)
        A[i] = (int)((long long)A[i-1]*i%N),
        B[i] = (int)((long long)B[i-1]*i%N),
        C[i] = (int)((long long)C[i-1]*i%N);

    for(i = N-1; i >= 1; i--)
        baga(MIN(A[i], B[i]), MAX(A[i], B[i]), C[i]);

    for(i = 1; i < N; i++)
        printf("%d\n", cul[i]);

    return 0;
}