Cod sursa(job #1827110)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 11 decembrie 2016 14:32:18
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <iostream>
#include <fstream>
#include <cstdio>
 
using namespace std;
 
ifstream in("curcubeu.in");
ofstream out("curcubeu.out");
 
const int nMax = 1000005;
 
int n;
int a[nMax], b[nMax], c[nMax];
int v[nMax];
int urm[nMax];
 
void citire()
{
    in >> n;
    in >> a[1] >> b[1] >> c[1];
}
 
int GetNext(int j)
{
    if(j < n && v[urm[j]] != 0)
        urm[j] = GetNext(urm[j]);
    return urm[j];
}
 
void rezolvare()
{
    for(int 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;
        urm[i-1] = i;
    }
    int st, dr;
    for(int i = n-1; i > 0; --i)
    {
        st = min(a[i], b[i]);
        dr = max(a[i], b[i]);
        int j = st;
        while(j <= dr)
        {
            if(v[j] == 0)
            {
                v[j] = c[i];
                urm[j] = dr + 1;
                ++j;
            }
            else
                j = GetNext(j);
        }
    }
}
 
void afisare()
{
	freopen("curcubeu.out", "w", stdout);
	for(int i = 1; i <= n; ++i)
		printf("%d ", v[i]);
}
 
int main()
{
    citire();
    rezolvare();
    afisare();
    return 0;
}