Cod sursa(job #95240)

Utilizator MariusMarius Stroe Marius Data 27 octombrie 2007 19:08:23
Problema Curcubeu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>

const char iname[] = "curcubeu.in";
const char oname[] = "curcubeu.out";

#define MAXN  1000000

typedef long long i64;

i64 A[MAXN], B[MAXN], C[MAXN];

int next[MAXN];

int color[MAXN + 1];

int stk[MAXN];

int find(int n) 
{
    int stk_len = 0;
    
    while (n != next[n])
        stk[stk_len ++] = n, n = next[n];
    for (; stk_len > 0; -- stk_len)
        next[stk[stk_len - 1]] = n;
    return n;
}

int main(void)
{
    i64 n;
    FILE *fi = fopen(iname, "r");
    
    fscanf(fi, "%lld", &n);
    for (int i = 1; i < n; ++ i)
    {
        if (i == 1)
            fscanf(fi, "%lld %lld %lld", &A[1], &B[1], &C[1]);
        else 
        {
            A[i] = (A[i - 1] * i) % n;
            B[i] = (B[i - 1] * i) % n;
            C[i] = (C[i - 1] * i) % n;
        }
        if (A[i] > B[i])
        {
            i64 tmp = A[i];
            A[i] = B[i], B[i] = tmp;
        }
        next[i] = i;
    }
    next[n] = n;
    fclose(fi);
    
    for (int i = n - 1; i > 0; -- i)
    {
        int p = A[i];
        while (p <= B[i]) 
        {
            if (color[p] == 0)
            {
                color[p] = C[i];
                next[p] = find(p + 1);
            }
            p = next[p];
        }
    }
    
    FILE *fo = fopen(oname, "w");
    
    for (int i = 1; i < n; ++ i)
        fprintf(fo, "%d\n", color[i]);
    fclose(fo);
    return 0;
}