結果
問題 | No.2744 Power! or +1 |
ユーザー |
|
提出日時 | 2024-04-13 15:29:20 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 860 ms / 3,000 ms |
コード長 | 1,718 bytes |
コンパイル時間 | 2,005 ms |
コンパイル使用メモリ | 201,008 KB |
最終ジャッジ日時 | 2025-02-21 01:05:33 |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 9 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;int main() {ll N, A, B, C;cin >> N >> A >> B >> C;vector fac(N, array<ll, 2>());fac[0] = {1, 0};for (int i = 1; i < N; i++) {fac[i][1] = fac[i - 1][1];fac[i][0] = fac[i - 1][0] * i % N;if (fac[i - 1][0] * i >= N) fac[i][1] = 1;}vector dist(N, array<ll, 2>({(ll)1e18, (ll)1e18}));dist[1][0] = 0;priority_queue<pair<ll, array<ll, 2>>, vector<pair<ll, array<ll, 2>>>,greater<pair<ll, array<ll, 2>>>>pq;pq.push({0, {1, 0}});ll mCOST = (N - 1) * A;while (pq.size()) {auto [d, v] = pq.top();pq.pop();// 操作1if (v[0] + 1 == N) {if (dist[(v[0] + 1) % N][1] > d + A) {dist[(v[0] + 1) % N][1] = d + A;pq.push({d + A, {(v[0] + 1) % N, 1}});}} else {if (dist[(v[0] + 1) % N][v[1]] > d + A) {dist[(v[0] + 1) % N][v[1]] = d + A;pq.push({d + A, {(v[0] + 1) % N, v[1]}});}}// 操作2{ll b = B, v2 = v[0];int ov_N = v[1];while (b < mCOST) {if (dist[v2][ov_N] > d + b) {dist[v2][ov_N] = d + b;pq.push({d + b, {v2, ov_N}});}b *= B;v2 *= v[0];if (v2 >= N) {v2 %= N;ov_N = 1;}}}// 操作3if (v[1]) {if (dist[0][1] > d + C) {dist[0][1] = d + C;pq.push({d + C, {0, 1}});}} else {if (dist[fac[v[0]][0]][fac[v[0]][1]] > d + C) {dist[fac[v[0]][0]][fac[v[0]][1]] = d + C;pq.push({d + C, {fac[v[0]][0], fac[v[0]][1]}});}}}cout << min(dist[0][0], dist[0][1]) << '\n';}