#include #include #include using namespace std; /** * Bài toán: Knapsack với điều kiện GCD >= W * Ý tưởng: Với mỗi g >= W, ta lấy tất cả vật phẩm có trọng lượng là bội của g. */ long long total_v[200005]; // Giả sử trọng lượng tối đa là 2e5 int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, W; cin >> N >> W; int max_w = 0; for (int i = 0; i < N; ++i) { int w, v; cin >> w >> v; if (w <= 200000) { total_v[w] += v; max_w = max(max_w, w); } } long long ans = 0; // Xét tất cả các giá trị g có thể làm GCD for (int g = W; g <= max_w; ++g) { long long current_v = 0; // Cộng dồn giá trị của các vật phẩm có trọng lượng là bội số của g for (int multiple = g; multiple <= max_w; multiple += g) { current_v += total_v[multiple]; } ans = max(ans, current_v); } cout << ans << endl; return 0; }