結果
| 問題 | No.3502 GCD Knapsack |
| コンテスト | |
| ユーザー |
zawakasu
|
| 提出日時 | 2026-04-17 21:59:19 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 131 ms / 2,000 ms |
| コード長 | 6,179 bytes |
| 記録 | |
| コンパイル時間 | 2,428 ms |
| コンパイル使用メモリ | 214,000 KB |
| 実行使用メモリ | 7,552 KB |
| 最終ジャッジ日時 | 2026-04-17 21:59:32 |
| 合計ジャッジ時間 | 5,331 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge3_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 |
ソースコード
#include <iostream>
#include <iomanip>
#include <cassert>
#include <vector>
#include <algorithm>
#include <utility>
#include <numeric>
#include <tuple>
#include <ranges>
#include <random>
// #include "Src/Number/IntegerDivision.hpp"
// #include "Src/Utility/BinarySearch.hpp"
// #include "Src/Sequence/CompressedSequence.hpp"
// #include "Src/Sequence/RunLengthEncoding.hpp"
// #include "Src/Algebra/Group/AdditiveGroup.hpp"
// #include "Src/DataStructure/FenwickTree/FenwickTree.hpp"
// #include "Src/DataStructure/SegmentTree/SegmentTree.hpp"
// #include "Src/DataStructure/DisjointSetUnion/DisjointSetUnion.hpp"
// #include "Src/DataStructure/Heap/BinaryHeap.hpp"
#include <cstdint>
#include <cstddef>
namespace zawa {
using i16 = std::int16_t;
using i32 = std::int32_t;
using i64 = std::int64_t;
using i128 = __int128_t;
using u8 = std::uint8_t;
using u16 = std::uint16_t;
using u32 = std::uint32_t;
using u64 = std::uint64_t;
using usize = std::size_t;
} // namespace zawa
#include <type_traits>
namespace zawa {
template <class T>
class PrimeFactor {
static_assert(std::is_unsigned_v<T>, "T must be unsigned integer");
private:
T factor_{};
u32 exponent_{};
public:
PrimeFactor() = default;
PrimeFactor(T factor, u32 exponent) : factor_{factor}, exponent_{exponent} {}
inline T factor() const noexcept {
return factor_;
}
inline u32 exponent() const noexcept {
return exponent_;
}
friend bool operator<(const PrimeFactor<T>& lhs, const PrimeFactor<T>& rhs) {
return lhs.factor() != rhs.factor() ?
lhs.factor() < rhs.factor() :
lhs.exponent() < rhs.exponent();
}
friend bool operator>(const PrimeFactor<T>& lhs, const PrimeFactor<T>& rhs) {
return lhs.factor() != rhs.factor() ?
lhs.factor() > rhs.factor() :
lhs.exponent() > rhs.exponent();
}
};
} // namespace zawa
#include <concepts>
namespace zawa {
class LinearSieve {
public:
using V = u32;
using F = PrimeFactor<V>;
private:
std::vector<V> primes_;
std::vector<V> lpf_;
public:
explicit LinearSieve(V n) : primes_{}, lpf_(n + 1) {
for (V i{2} ; i <= n ; i++) {
if (!lpf_[i]) {
lpf_[i] = i;
primes_.emplace_back(i);
}
for (V p : primes_) {
if (static_cast<u64>(p) * i > n) break;
lpf_[p * i] = p;
}
}
}
V size() const noexcept {
return static_cast<V>(lpf_.size()) - 1;
}
bool isPrime(V x) const noexcept {
assert(x < lpf_.size());
return lpf_[x] == x;
}
bool operator[](V x) const noexcept {
assert(x < lpf_.size());
return lpf_[x] == x;
}
std::vector<V> primes() const {
return primes_;
}
// @note: response array is not sorted.
template <std::integral T = V>
std::vector<T> divisor(V x) const {
assert(0u < x and x < lpf_.size());
std::vector<T> res(1, 1u);
while (x > 1) {
V factor{lpf_[x]};
u32 exponent{};
while (lpf_[x] == factor) {
exponent++;
x /= lpf_[x];
}
usize line{res.size()};
V now{1};
for (u32 i{} ; i < exponent ; i++) {
now *= factor;
for (usize j{} ; j < line ; j++) {
res.emplace_back(static_cast<T>(res[j] * now));
}
}
}
return res;
}
std::vector<F> factorize(V x) const {
assert(0u < x and x < lpf_.size());
std::vector<F> res;
while (x > 1) {
V factor{lpf_[x]};
u32 exponent{};
while (lpf_[x] == factor) {
exponent++;
x /= lpf_[x];
}
res.emplace_back(factor, exponent);
}
return res;
}
i32 mobius(V x) const {
assert(0u < x and x < lpf_.size());
i32 res = 1;
while (x > 1u) {
V factor = lpf_[x];
u32 exp = 0;
while (lpf_[x] == factor) {
x /= factor;
exp++;
}
if (exp >= 2u) return 0;
res *= -1;
}
return res;
}
};
} // namespace zawa
namespace zawa {}
using namespace zawa;
// #include "atcoder/modint"
// using mint = atcoder::modint998244353;
// #include <array>
// #include <bit>
// #include <bitset>
// #include <climits>
// #include <cmath>
// #include <set>
// #include <unordered_set>
// #include <map>
// #include <unordered_map>
// #include <optional>
// #include <queue>
// #include <stack>
// #include <deque>
// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
using namespace std;
template <class T, class U>
ostream& operator<<(ostream& os, const pair<T, U>& p) {
os << '(' << p.first << ',' << p.second << ')';
return os;
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
for (int i = 0 ; i < ssize(v) ; i++)
os << v[i] << (i + 1 == ssize(v) ? "" : " ");
return os;
}
/*
*/
int main() {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cout << fixed << setprecision(20);
#if !defined DEBUG
int N,W;
cin >> N >> W;
vector<int> X(N),Y(N);
for (auto& x : X)
cin >> x;
for (auto& x : Y)
cin >> x;
const int MAX = 200020;
LinearSieve siv{MAX};
vector<long long> ans(MAX+1);
for (int i = 0 ; i < N ; i++)
for (int d : siv.divisor<int>(X[i]))
ans[d] += Y[i];
long long val = 0;
for (int i = W ; i <= MAX ; i++)
val = max(val,ans[i]);
cout << val << '\n';
#else
mt19937_64 mt{random_device{}()};
for (int testcase = 0 ; ; ) {
cerr << "----------" << ++testcase << "----------" << endl;
auto a = solve(), b = naive();
if (a != b) {
// print testcase
cerr << "you: " << a << endl;
cout << "correct: " << b << endl;
exit(0);
}
}
#endif
}
zawakasu