Cod sursa(job #3364844)

Utilizator filipdanieloanFilip-Daniel Oancea filipdanieloan Data 12 septembrie 2026 11:59:07
Problema Curcubeu Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>
using namespace std;

struct Padure {
    vector<int> padre, sz;

    Padure(int n) {
        padre.resize(n);
        iota(padre.begin(), padre.end(), 0);
        sz.assign(n, 1);
    }

    int rad(int x) {
        if (padre[x] == x) { return x; }
        return padre[x] = rad(padre[x]);
    }

    void join(int a, int b) {
        a = rad(a);
        b = rad(b);

        if (a != b) {
            if (sz[a] > sz[b]) { swap(a, b); }
            padre[a] = b;
            sz[b] += sz[a];
        }
    }
};

int MOD;

int lgpow(int a, int n) {
    a %= MOD;
    int p = 1;
    for (; n; n >>= 1) {
        if (n & 1) {
            p = p * a % MOD;
        }
        a = a * a % MOD;
    }
    return p;
}

int inv_mod(int a) {
    return lgpow(a, MOD - 2);
}

int main() {
#ifndef LOCAL
    cin.tie(nullptr)->sync_with_stdio(false);
    freopen("curcubeu.in", "r", stdin);
    freopen("curcubeu.out", "w", stdout);
#endif

    int n, a, b, c; cin >> n >> a >> b >> c;
    MOD = n;
    vector<int> ans(n);
    vector<bool> active(n, true);
    for (int i = 1; i < n; ++i) {
        a = a * i % MOD;
        b = b * i % MOD;
        c = c * i % MOD;
    }

    Padure dsu(n);

    for (int i = n - 1; i >= 1; --i) {
        int idx = min(a, b), end = max(a, b);
        while (idx <= end) {
            if (active[idx]) {
                ans[idx] = c;
                active[idx] = false;
                if (idx + 1 < n && !active[idx + 1]) {
                    dsu.join(idx + 1, idx);
                }
                if (idx - 1 > 0 && !active[idx - 1]) {
                    dsu.join(idx, idx - 1);
                }
            }
            idx += dsu.sz[dsu.rad(idx)];
        }
        if (i == 1) { continue; }
        a = a * inv_mod(i) % MOD;
        b = b * inv_mod(i) % MOD;
        c = c * inv_mod(i) % MOD;
    }

    for (int i = 1; i < n; ++i) {
        cout << ans[i] << '\n';
    }

    return 0;
}