結果
問題 | No.2039 Copy and Avoid |
ユーザー |
|
提出日時 | 2022-08-12 22:12:30 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 84 ms / 2,000 ms |
コード長 | 2,350 bytes |
コンパイル時間 | 1,381 ms |
コンパイル使用メモリ | 132,536 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-09-23 02:44:31 |
合計ジャッジ時間 | 2,882 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 31 |
ソースコード
#include <algorithm>#include <array>#include <bitset>#include <cassert>#include <cmath>#include <complex>#include <cstdio>#include <cstdlib>#include <cstring>#include <deque>#include <forward_list>#include <fstream>#include <initializer_list>#include <iomanip>#include <ios>#include <iostream>#include <istream>#include <iterator>#include <list>#include <map>#include <numeric>#include <ostream>#include <queue>#include <random>#include <set>#include <sstream>#include <streambuf>#include <string>#include <tuple>#include <unordered_map>#include <unordered_set>#include <utility>#include <valarray>#include <vector>using namespace std;using ll = long long;using cd = complex<double>;constexpr ll mod = 1e9 + 7, maxn = 3e5 + 10;ll lgput(ll x, ll y, ll r) { return y == 0 ? r : lgput(x * x % mod, y / 2, y % 2 ? x * r % mod : r); }ll gcd(ll x, ll y) { return y == 0 ? x : gcd(y, x % y); }pair<ll, ll> euclid_extins(ll x, ll y) {pair<ll, ll> tmp;return x == 0? make_pair(0ll, 1ll): (tmp = euclid_extins(y % x, x), swap(tmp.first, tmp.second), tmp.first -= tmp.second * (y / x), tmp);}ll inv_mod(ll x, ll mod) { return (euclid_extins(mod, x).second % mod + mod) % mod; }int n, m, a, b;vector<int> bad;vector<long long> factors, dp;int main() {ios_base::sync_with_stdio(false);cin.tie(nullptr);cin >> n >> m >> a >> b;bad.resize(m);for (auto& x : bad) cin >> x;for (int i = 1; i * i <= n; ++i)if (n % i == 0) {factors.push_back(i);factors.push_back(n / i);}sort(begin(factors), end(factors));factors.erase(unique(begin(factors), end(factors)), end(factors));dp.resize(factors.size(), (long long)1e9 * (long long)1e9 + 10);dp[0] = 0;for (int i = 0; i < factors.size(); ++i) {long long max_jmp = (ll)1e9 * (ll)1e9;for (auto b : bad)if (b % factors[i] == 0) max_jmp = min(max_jmp, (ll)b);for (int j = i + 1; j < factors.size(); ++j) {if (factors[j] >= max_jmp) break;if (factors[j] % factors[i]) continue;dp[j] = min(dp[j], dp[i] + (long long)a * (factors[j] / factors[i] - 1) + b);}}cout << (dp.back() > (ll)1e9 * (ll)1e9 ? -1 : dp.back() - b) << endl;}