Cod sursa(job #85519)

Utilizator wefgefAndrei Grigorean wefgef Data 21 septembrie 2007 17:53:40
Problema Curcubeu Scor Ascuns
Compilator cpp Status done
Runda Marime 1.09 kb
#include <stdio.h>
#include <string>

#define maxn 1000010
#define min(a,b) (a < b ? a : b)
#define max(a,b) (a > b ? a : b)

int n,x,y,z,l;
int a[maxn],b[maxn],c[maxn],next[maxn],s[maxn];

inline int drum(int x)
{
       int y=x,aux;
       for (;s[x];x=next[x]);
       for (;s[y];)
       {
           aux=y;
           y=next[y];
           next[aux]=x;
       }
       return x;
}

int main()
{
    freopen("curcubeu.in","r",stdin);
    freopen("curcubeu.out","w",stdout);
    
    scanf("%d %d %d %d ",&n,&a[1],&b[1],&c[1]);
    
    int i,j;
    
    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;
    
    for (i=1;i<=n;i++) next[i]=i+1;
    
    for (i=n-1;i>0;i--) 
    {
        if (a[i]<b[i]) x=a[i],y=b[i];
        else x=b[i],y=a[i];
         
        if (s[x]==0) s[x]=c[i];
        for (j=drum(x);j<=y;j=z) 
         {
             s[j]=c[i];
             z=drum(j);
             next[j]=next[y];
         }
        next[x]=next[y];
    }
    
    for (i=1;i<n;i++) printf("%d\n",s[i]);
    
    return 0;
}