結果
| 問題 |
No.2039 Copy and Avoid
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-08-12 22:33:49 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 29 ms / 2,000 ms |
| コード長 | 1,177 bytes |
| コンパイル時間 | 1,680 ms |
| コンパイル使用メモリ | 175,484 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-23 03:12:58 |
| 合計ジャッジ時間 | 2,793 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 31 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const long long INF = 1E18 + 7;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, a, b; cin >> n >> m >> a >> b;
vector<int> c(m);
for (int i = 0; i < m; i++) {
cin >> c[i];
}
vector<int> div;
for (int i = 1; i * i <= n; i++) {
if (n % i == 0) {
div.push_back(i);
if (n / i != i) {
div.push_back(n / i);
}
}
}
sort(div.begin(), div.end());
int d = div.size();
vector<long long> dst(d, INF);
long long ans = INF;
dst[0] = 0;
for (int i = 0; i < d; i++) {
int max_div = n + 1;
for (int v : c) {
if (v % div[i] == 0) {
max_div = min(max_div, v);
}
}
if (max_div > n) {
ans = min(ans, dst[i] + 1LL * (n / div[i] - 1) * a);
}
for (int j = i + 1; j < d; j++) {
if (div[j] < max_div && div[j] % div[i] == 0) {
dst[j] = min(dst[j], dst[i] + b + 1LL * (div[j] / div[i] - 1) * a);
}
}
}
cout << (ans == INF ? -1 : ans);
}