結果

問題 No.2844 Birthday Party Decoration
ユーザー Today03
提出日時 2024-08-25 20:30:30
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 10 ms / 2,000 ms
コード長 999 bytes
コンパイル時間 2,098 ms
コンパイル使用メモリ 195,804 KB
最終ジャッジ日時 2025-02-24 02:12:35
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 4
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int INF = 1e9 + 10;
const ll INFL = 4e18;

ll solve() {
    int N;
    ll X;
    cin >> N >> X;
    vector<int> C;
    for (int i = 0, x; i < N; i++) {
        int c;
        cin >> c;
        if (int x = X >> c & 1; !x) {
            C.push_back(c);
        }
    }
    N = C.size();

    if (N == 0) {
        return 0;
    }

    int t = C.back();
    ll ans = INFL;

    // 大きい方向に買いに行く Xより大きい、t bitが立っているような最小の整数
    // goal/(2^t)=奇数
    {
        ll goal = (X / (1ll << t) + 1) * (1ll << t);
        ans = min(ans, (goal - X) * 2);
    }
    // 小さい方向
    // goal/(2^t)=奇数,(goal+1)/(2^t)=偶数
    if (X / (1ll << t) > 0) {
        ll goal = (X / (1ll << t)) * (1ll << t) - 1;
        ans = min(ans, (X - goal) * 2);
    }

    return ans;
}

int main() {
    int T;
    cin >> T;

    while (T--) {
        cout << solve() << endl;
    }
}
0