#include #include #include #include #include using namespace std; vector get_divisors(long long x) { vector ret; for (long long i = 1; i * i <= x; ++i) { if (x % i == 0) { ret.push_back(i); if (i * i != x) { ret.push_back(x / i); } } } sort(ret.begin(), ret.end()); return ret; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; long long w; if (!(cin >> n >> w)) return 0; vector x(n), y(n); for (int i = 0; i < n; ++i) cin >> x[i]; for (int i = 0; i < n; ++i) cin >> y[i]; vector ss; for (int i = 0; i < n; ++i) { vector divs = get_divisors(x[i]); ss.insert(ss.end(), divs.begin(), divs.end()); } sort(ss.begin(), ss.end()); ss.erase(unique(ss.begin(), ss.end()), ss.end()); int m = ss.size(); vector dp(m, 0); for (int i = 0; i < n; ++i) { vector ndp = dp; long long xi = x[i]; long long yi = y[i]; for (int j = 0; j < m; ++j) { long long g = __gcd(xi, ss[j]); auto it = lower_bound(ss.begin(), ss.end(), g); int ni = distance(ss.begin(), it); if (dp[j] + yi > ndp[ni]) { ndp[ni] = dp[j] + yi; } } dp = move(ndp); } long long ans = 0; for (int i = 0; i < m; ++i) { if (ss[i] >= w) { if (dp[i] > ans) { ans = dp[i]; } } } cout << ans << endl; return 0; }