結果

問題 No.3502 GCD Knapsack
コンテスト
ユーザー Azaki
提出日時 2026-04-18 04:28:55
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
RE  
実行時間 -
コード長 1,989 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,208 ms
コンパイル使用メモリ 165,012 KB
実行使用メモリ 6,400 KB
最終ジャッジ日時 2026-04-18 04:29:09
合計ジャッジ時間 8,346 ms
ジャッジサーバーID
(参考情報)
judge1_1 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 2 RE * 1
other RE * 35
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <iostream>
#include <vector>
#include <algorithm>

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;
}
0