Pagini recente » Borderou de evaluare (job #3365538) | Borderou de evaluare (job #3365543) | Borderou de evaluare (job #3365542) | Borderou de evaluare (job #3364846) | Cod sursa (job #3364844)
#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;
}