Pagini recente » Cod sursa (job #3364844) | Monitorul de evaluare | Cod sursa (job #3365535) | Cod sursa (job #3364847) | Cod sursa (job #3364848)
#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 = int(1LL * a * i % MOD);
b = int(1LL * b * i % MOD);
c = int(1LL * c * i % MOD);
}
Padure dsu(n);
for (int i = n - 1; i >= 1; --i) {
int idx = min(a, b), end = max(a, b);
idx = dsu.find_next(idx);
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 = int(1LL * a * invi % MOD);
b = int(1LL * b * invi % MOD);
c = int(1LL * c * invi % MOD);
}
for (int i = 1; i < n; ++i) {
cout << ans[i] << '\n';
}
return 0;
}