Cod sursa(job #3194257)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 17 ianuarie 2024 14:22:22
Problema Curcubeu Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

ifstream fin ("curcubeu.in");
ofstream fout ("curcubeu.out");

const int NMAX=1e6+5;

#define int long long

int ans[NMAX];
int t[NMAX];
int a[NMAX];
int b[NMAX];
int c[NMAX];

int root(int x)
{
    if(t[x]==x)
        return x;
    return t[x]=root(t[x]);
}

void solve(int x,int y)
{
    x=root(x);
    y=root(y);
    if(x==y)
        return ;
    else
    {
        if(x<y)
            swap(x,y);
        t[y]=x;
    }
}

signed main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    int n,i,j;
    fin>>n;
    fin>>a[1]>>b[1]>>c[1];
    for(i=2;i<n;i++)
    {
        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])
            swap(a[i],b[i]);
    }
    for(i=n-1;i>=1;i--)
    {
        for(j=a[i];j<=b[i];j++)
        {
            if(ans[j])
                j=root(j);
            else
            {
                ans[j]=c[i];
                t[j]=j;
                if(j-1>=1 && ans[j])
                    solve(j,j-1);
                if(j+1<=n && ans[j])
                    solve(j,j+1);
            }
        }
    }
    for(i=1;i<n;i++)
        fout<<ans[i]<<"\n";
    fin.close();
    fout.close();
    return 0;
}