#include #include #include #include using namespace std; /** * Bài toán: GCD Knapsack (GCD >= W) * Logic: GCD của tập được chọn phải là g >= W. * Điều này có nghĩa là mọi w_i trong tập đó phải chia hết cho g. */ int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; long long W; cin >> N >> W; map gcd_sums; for (int i = 0; i < N; ++i) { long long w, v; cin >> w >> v; if (w < W) continue; // Tìm tất cả ước số d của w sao cho d >= W for (long long d = 1; d * d <= w; ++d) { if (w % d == 0) { if (d >= W) { gcd_sums[d] += v; } if (w / d != d && (w / d) >= W) { gcd_sums[w / d] += v; } } } } long long max_val = 0; for (auto const& [g, total_v] : gcd_sums) { max_val = max(max_val, total_v); } cout << max_val << endl; return 0; }