結果
| 問題 |
No.937 Ultra Sword
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-12-01 16:01:01 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 153 ms / 3,000 ms |
| コード長 | 2,210 bytes |
| コンパイル時間 | 2,225 ms |
| コンパイル使用メモリ | 202,960 KB |
| 最終ジャッジ日時 | 2025-01-08 06:37:33 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 47 |
ソースコード
#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i))
#define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i))
#define REP_R(i, n) for (int i = (int)(n) - 1; (i) >= 0; -- (i))
#define ALL(x) std::begin(x), std::end(x)
using namespace std;
template <class T, class U> inline void chmin(T & a, U const & b) { a = min<T>(a, b); }
/**
* @note O(\sqrt{n})
*/
struct prepared_primes {
int size;
std::vector<int> sieve;
std::vector<int> primes;
prepared_primes(int size_)
: size(size_) {
sieve.resize(size);
REP3 (p, 2, size) if (sieve[p] == 0) {
primes.push_back(p);
for (int k = p; k < size; k += p) {
if (sieve[k] == 0) {
sieve[k] = p;
}
}
}
}
};
int64_t solve(int n, const vector<int64_t> & a) {
// Gaussian elimination
vector<int64_t> basis;
for (int64_t a_i : a) {
for (int k = 0; (a_i << k) < (1ull << 40); ++ k) {
int64_t x = a_i << k;
for (int64_t b : basis) {
chmin(x, x ^ b);
}
if (x) {
basis.push_back(x);
}
}
}
// list constructibles
int64_t max_a = *max_element(ALL(a));
vector<bool> constructed(max_a + 1);
constructed[0] = true;
for (int64_t b : basis) {
REP (x, max_a) if (constructed[x]) {
if ((b ^ x) < constructed.size()) {
constructed[b ^ x] = true;
}
}
}
// fast zeta transform
prepared_primes primes(1e5 + 3);
vector<int64_t> acc(max_a + 1);
for (int64_t a_i : a) {
acc[a_i] += a_i;
}
for (int64_t p : primes.primes) {
REP_R (x, max_a / p + 1) {
acc[x] += acc[x * p];
}
}
// answer
int64_t sum = accumulate(ALL(a), 0ll);
int64_t answer = INT64_MAX;
REP3 (x, 1, max_a + 1) if (constructed[x]) {
chmin(answer, sum - acc[x] + acc[x] / x);
}
return answer;
}
int main() {
int n; cin >> n;
vector<int64_t> a(n);
REP (i, n) {
cin >> a[i];
}
cout << solve(n, a) << endl;
return 0;
}