結果
| 問題 |
No.2744 Power! or +1
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-03-12 13:44:08 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,149 bytes |
| コンパイル時間 | 4,367 ms |
| コンパイル使用メモリ | 297,976 KB |
| 実行使用メモリ | 323,828 KB |
| 最終ジャッジ日時 | 2025-03-12 13:44:25 |
| 合計ジャッジ時間 | 14,798 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 2 |
| other | TLE * 1 -- * 8 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const long long INFTY = 5e10;
int main() {
int N, a, b, c;
cin >> N >> a >> b >> c;
map<int, int> C;
int x = N;
for (int i = 2; i * i <= N; ++i) {
while (x % i == 0) {
x /= i;
C[i]++;
}
}
if (x > 1) {
C[x]++;
}
int n = 0;
for (auto &[p, cnt] : C) {
n = max(n, (int)pow(p, cnt));
}
int K = 0;
while (pow(b, K) <= (long long)N * a) {
K++;
}
vector<int> A(N);
A[0] = A[1] = 1;
for (int i = 2; i < N; ++i) {
A[i] = (A[i - 1] * i) % N;
}
vector<vector<pair<int, long long>>> G(N + 1);
for (int i = 1; i < N; ++i) {
G[i].emplace_back((i + 1) % N, a);
}
G[N].emplace_back(0, c);
for (int i = 2; i < N; ++i) {
for (int k = 2; k <= K; ++k) {
int m = 1;
for (int j = 0; j < k; ++j) {
m = (1LL * m * i) % N;
}
G[i].emplace_back(m, (long long)pow(b, k));
}
int k1 = 2;
while (pow(i, k1) < n) {
k1++;
}
for (int k = k1; k <= K; ++k) {
G[i].emplace_back(N, (long long)pow(b, k));
}
}
long long prod = 1;
int J = N - 1;
for (int i = 2; i < N; ++i) {
prod *= i;
if (prod >= n) {
J = i;
break;
}
}
for (int i = 2; i < N; ++i) {
G[i].emplace_back(A[i], c);
if (i >= J) {
G[i].emplace_back(N, c);
}
}
for (int i = n; i < N; ++i) {
G[i].emplace_back(0, c);
}
vector<long long> dist(N + 1, INFTY);
dist[1] = 0;
priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<>> que;
que.emplace(0, 1);
while (!que.empty()) {
auto [d, u] = que.top(); que.pop();
if (dist[u] < d) continue;
for (auto &[v, cost] : G[u]) {
if (dist[v] > d + cost) {
dist[v] = d + cost;
que.emplace(dist[v], v);
}
}
}
cout << dist[0] << endl;
return 0;
}