Cod sursa(job #3364846)

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

struct Padure {
    vector<int> nxt;

    Padure(int n) {
        nxt.resize(n + 1);
        iota(nxt.begin(), nxt.end(), 0);
    }

    int find_next(int x) {
        if (nxt[x] == x) { return x; }
        return nxt[x] = find_next(nxt[x]);
    }
};

int MOD;

int lgpow(int a, int n) {
    a %= MOD;
    int p = 1;
    for (; n; n >>= 1) {
        if (n & 1) {
            p = int(1LL * p * a % MOD);
        }
        a = int(1LL * 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);
    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) {
            ans[idx] = c;
            dsu.nxt[idx] = idx + 1;
            idx = dsu.find_next(idx);
        }
        if (i == 1) { continue; }
        int invi = inv_mod(i);
        a = a * invi % MOD;
        b = b * invi % MOD;
        c = c * invi % MOD;
    }

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

    return 0;
}