Cod sursa(job #87666)

Utilizator Ragnar_LodbrokGrosu Codrut Ragnar_Lodbrok Data 28 septembrie 2007 15:01:25
Problema Curcubeu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <stdio.h>

#define NMAX 1000000

#define minim(a,b) ((a>b)?(b):(a))
#define maxim(a,b) ((a>b)?(a):(b))

typedef long long LL;

FILE *fin,*fout;

int N,A,B,C;

struct operatie
{int a,b,c;
}op[NMAX+1];

int tata[NMAX+1];
int color[NMAX+1];

int find(int p)
{int i,rad,next;
 for (i=p;tata[i];i=tata[i]);
 rad=i;
 for (i=p;i!=rad;i=next) {next=tata[i];tata[i]=rad;}
 return rad;
}

int main()
{int i,cs,cd,j;
 fin=fopen("curcubeu.in","r");
 fscanf(fin,"%d %d %d %d",&N,&A,&B,&C);
 fclose(fin);
 op[1].a=A;op[1].b=B;op[1].c=C;
 for (i=2;i<=N-1;++i)
    {op[i].a=((LL)op[i-1].a*(LL)i)%N;
     op[i].b=((LL)op[i-1].b*(LL)i)%N;
     op[i].c=((LL)op[i-1].c*(LL)i)%N;
    }
 for (i=N-1;i>=1;--i)
    {cs=minim(op[i].a,op[i].b);
     cd=maxim(op[i].a,op[i].b);
     for (j=find(cs);j<=cd;j=find(j)) {color[j]=op[i].c;tata[j]=j+1;}
    }
 fout=fopen("curcubeu.out","w");
 for (i=1;i<=N-1;++i)
   fprintf(fout,"%d\n",color[i]);
 fclose(fout);
 return 0;
}