#define USE_ACLIBRARY 0 #if __has_include("all.hpp") && 0 #include "all.hpp" #else #include #if __has_include() || USE_ACLIBRARY #include #endif #endif #define ov4(a, b, c, d, name, ...) name #define rep3(i, a, b, c) for (ll i = (a); i < (b); i += (c)) #define rep2(i, a, b) rep3(i, a, b, 1) #define rep1(i, n) rep2(i, 0, n) #define rep0(n) rep1(aaaaa, n) #define rep(...) ov4(__VA_ARGS__, rep3, rep2, rep1, rep0)(__VA_ARGS__) #define per(i, a, b) for (ll i = (a) - 1; i >= (b); i--) using ll = long long int; using ull = unsigned long long int; using pll = std::pair; using pil = std::pair; using pli = std::pair; using pii = std::pair; using namespace std::literals; std::mt19937_64 rng{std::random_device()()}; template bool chmin(T& x, const T& val) { if (x > val) { x = val; return true; } else { return false; } } template bool chmin2(T& x, const T& val) { if (x < 0 || x > val) { x = val; return true; } else { return false; } } template bool chmax(T& x, const T& val) { if (x < val) { x = val; return true; } else { return false; } } ll isqrt(ll n) { assert(n >= 0); if (n == 0) return 0; uint32_t c = (std::bit_width(uint64_t(n)) - 1) / 2; ll a = 1; ll d = 0; for (int s = std::bit_width(c) - 1; s >= 0; s--) { ll e = d; d = c >> s; a = (a << (d - e - 1)) + (n >> (2 * c - e - d + 1)) / a; } return a - (a * a > n); } #if __has_include() || USE_ACLIBRARY template * = nullptr> std::ostream& operator<<(std::ostream& os, const mint& v) { return os << v.val(); } template * = nullptr> std::istream& operator>>(std::istream& is, mint& v) { int tmp; is >> tmp; v = tmp; return is; } #endif template std::istream& operator>>(std::istream& is, std::pair& p) { return is >> p.first >> p.second; } template std::istream& operator>>(std::istream& is, std::tuple& tpl) { std::apply([&](auto&&... args) { (is >> ... >> args); }, tpl); return is; } template std::istream& operator>>(std::istream& is, std::vector& v) { for (T& x : v) is >> x; return is; } template std::ostream& operator<<(std::ostream& os, const std::vector& v) { for (size_t i = 0; i < v.size(); i++) os << v[i] << (i == v.size() - 1 ? "" : " "); return os; } template std::vector make_vector(I n, const T& x) { return std::vector(n, x); } template auto make_vector(I i, J j, K k, Ts&&... xs) { return std::vector(i, make_vector(j, k, xs...)); } struct Initialization { Initialization() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); } } initialization; constexpr const std::pair DIRS[] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; template using infs = std::numeric_limits; template class factorials { public: static size_t n; static std::vector fact, inv_fact; static inline void extend(size_t m) { if (m <= n) return; fact.resize(m + 1); inv_fact.resize(m + 1); for (size_t i = n + 1; i <= m; i++) fact[i] = fact[i - 1] * i; inv_fact[m] = fact[m].inv(); for (size_t i = m; i > n + 1; i--) inv_fact[i - 1] = inv_fact[i] * i; n = m; } static T inv(int k) { extend(k); return inv_fact[k]; } static T get(int k) { extend(k); return fact[k]; } static T perm(int n, int k) { if (n < k) return 0; if (k < 0) return 0; extend(n); return fact[n] * inv_fact[n - k]; } static T choose(int n, int k) { if (n < k) return 0; if (k < 0) return 0; extend(n); return fact[n] * inv_fact[n - k] * inv_fact[k]; } static T catalan(int n) { return get(2 * n) * inv(n + 1) * inv(n); } }; template size_t factorials::n = 0; template std::vector factorials::fact = {1}; template std::vector factorials::inv_fact = {1}; #if __has_include() || USE_ACLIBRARY using mint = atcoder::modint998244353; // using mint = atcoder::modint1000000007; using fs = factorials; #endif template using pq_rev = std::priority_queue, std::greater>; namespace pbds = __gnu_pbds; template using tree = pbds::tree, pbds::rb_tree_tag, pbds::tree_order_statistics_node_update>; int main() { ll N, W; std::cin >> N >> W; std::vector XY(N); rep(i, N) { std::cin >> XY[i].first; } rep(i, N) { std::cin >> XY[i].second; } std::vector sums(200000 + 1); for (auto [x, y] : XY) { sums[x] += y; } rep(i, 1, 200001) { rep(k, i * 2, 200001, i) { sums[i] += sums[k]; } } ll ans = 0; rep(i, W, 200001) { chmax(ans, sums[i]); } std::println("{}", ans); }