#include #include #include using namespace std; /** * Bài toán: GCD Knapsack (GCD >= W) * Ràng buộc: N, W, X <= 2*10^5; Y <= 10^9 */ long long weight_values[200005]; // Lưu tổng giá trị cho từng trọng lượng int main() { ios::sync_with_stdio(false); cin.tie(NULL); int N, W; if (!(cin >> N >> W)) return 0; int max_x = 0; for (int i = 0; i < N; ++i) { int x; long long y; cin >> x >> y; weight_values[x] += y; // Cộng dồn giá trị cho các vật phẩm cùng trọng lượng if (x > max_x) max_x = x; } // Nếu trọng lượng lớn nhất hiện có nhỏ hơn W, không thể chọn được GCD >= W if (max_x < W) { // Tùy theo yêu cầu đề bài cho trường hợp không thể, thường là -1 hoặc 0 // Dựa trên mô tả của bạn: "được hay không, nếu được thì..." // Ở đây chúng ta sẽ kiểm tra kết quả cuối cùng } long long max_ans = -1; // Duyệt g từ W đến giá trị trọng lượng lớn nhất for (int g = W; g <= max_x; ++g) { long long current_v = 0; bool found = false; // Tính tổng giá trị của các vật phẩm có trọng lượng là bội của g for (int multiple = g; multiple <= max_x; multiple += g) { if (weight_values[multiple] > 0) { current_v += weight_values[multiple]; found = true; } } if (found) { if (max_ans == -1 || current_v > max_ans) { max_ans = current_v; } } } if (max_ans == -1) { // Nếu không có cách nào (ví dụ tất cả X_i < W) // Lưu ý: Kiểm tra đề bài xem in -1 hay thông báo gì khác // Giả sử in -1 } else { cout << max_ans << endl; } return 0; }