#include #include #include using namespace std; /** * Bài toán: GCD Knapsack (GCD >= W) * Khắc phục RE: * - Kiểm tra giới hạn mảng động dựa trên max_x thực tế. * - Sử dụng long long cho tổng giá trị Y_i. */ int main() { // Tăng tốc độ nhập xuất ios_base::sync_with_stdio(false); cin.tie(NULL); int N; long long W; if (!(cin >> N >> W)) return 0; vector> items(N); int max_x = 0; for (int i = 0; i < N; ++i) { cin >> items[i].first >> items[i].second; if (items[i].first > max_x) max_x = items[i].first; } // Nếu W lớn hơn mọi X_i, chắc chắn không thể chọn được GCD >= W if (W > max_x) { // Tùy đề bài yêu cầu in gì khi không thể, ví dụ in 0 hoặc -1 // Dựa trên "có thể hay không", thường là không in gì hoặc in 0 return 0; } // Khởi tạo mảng cộng dồn giá trị với kích thước linh hoạt vector weight_sums(max_x + 1, 0); for (int i = 0; i < N; ++i) { weight_sums[items[i].first] += items[i].second; } long long final_ans = -1; // Duyệt qua từng g đóng vai trò là GCD tiềm năng (g >= W) for (int g = (int)W; g <= max_x; ++g) { long long current_v = 0; bool has_item = false; // Tổng hợp tất 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_sums[multiple] > 0) { current_v += weight_sums[multiple]; has_item = true; } } // Cập nhật kết quả lớn nhất if (has_item) { if (final_ans == -1 || current_v > final_ans) { final_ans = current_v; } } } // In kết quả if (final_ans != -1) { cout << final_ans << endl; } return 0; }