#pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include // #include // using namespace atcoder; using namespace std; using ll = long long; using pll = pair; using vll = vector; using vvll = vector; using vpll = vector; using vvpll = vector; #define rep(i, l, r) for (ll i = l; i < ll(r); i++) #define rrep(i, l, r) for (ll i = ll(r-1); i >= l; i--) #pragma region // doubling template T fpow(T base, T id, ll exp, std::function bop); template T fpow(T base, ll exp); template T fpow(T base, ll exp) { T ans = 1; while (exp > 0) { if (exp & 1ll) { ans = ans * base; } base = base * base; exp >>= 1; } return ans; } template T fpow(T base, T id, ll exp, std::function bop) { T ans = id; while (exp > 0) { if (exp & 1ll) { ans = bop(ans, base); } base = bop(base, base); exp >>= 1; } return ans; } #pragma endregion #pragma region #pragma endregion #include using namespace atcoder; using mint = modint998244353; int main() { ll n, a, b, c; cin >> n >> a >> b >> c; vll ans1(n, LLONG_MAX), ans2(n, LLONG_MAX); priority_queue, vector>, greater>> pq; pq.emplace(a + b, 1, true); pq.emplace(a + b, 1, false); set> s; while (pq.size()) { auto [cost, value, addoneable] = pq.top(); // cerr << cost << " " << value << " " << addoneable << endl; pq.pop(); if (addoneable) { if (ans1[value] <= cost) continue; ans1[value] = cost; } else { if (ans2[value] <= cost) continue; ans2[value] = cost; } pq.emplace(cost + c, (value * 2) % n, false); pq.emplace(cost + a + b + c, (value * 2 + 1) % n, true); if (addoneable) pq.emplace(cost + a, (value + 1) % n, true); } rep(i, 0, n) { cout << min(ans1[i], ans2[i]) << "\n"; } cout << flush; }