#include #include #include #include #include #include #include #include #include #include // #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 #include 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 namespace zawa { template class PrimeFactor { static_assert(std::is_unsigned_v, "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& lhs, const PrimeFactor& rhs) { return lhs.factor() != rhs.factor() ? lhs.factor() < rhs.factor() : lhs.exponent() < rhs.exponent(); } friend bool operator>(const PrimeFactor& lhs, const PrimeFactor& rhs) { return lhs.factor() != rhs.factor() ? lhs.factor() > rhs.factor() : lhs.exponent() > rhs.exponent(); } }; } // namespace zawa #include namespace zawa { class LinearSieve { public: using V = u32; using F = PrimeFactor; private: std::vector primes_; std::vector 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(p) * i > n) break; lpf_[p * i] = p; } } } V size() const noexcept { return static_cast(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 primes() const { return primes_; } // @note: response array is not sorted. template std::vector divisor(V x) const { assert(0u < x and x < lpf_.size()); std::vector 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(res[j] * now)); } } } return res; } std::vector factorize(V x) const { assert(0u < x and x < lpf_.size()); std::vector 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 // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #pragma GCC target("avx2") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") using namespace std; template ostream& operator<<(ostream& os, const pair& p) { os << '(' << p.first << ',' << p.second << ')'; return os; } template ostream& operator<<(ostream& os, const vector& 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 X(N),Y(N); for (auto& x : X) cin >> x; for (auto& x : Y) cin >> x; const int MAX = 200020; LinearSieve siv{MAX}; vector ans(MAX+1); for (int i = 0 ; i < N ; i++) for (int d : siv.divisor(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 }