結果

問題 No.3249 AND
ユーザー D M
提出日時 2025-09-26 09:49:56
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 34 ms / 2,000 ms
コード長 1,447 bytes
コンパイル時間 3,869 ms
コンパイル使用メモリ 278,832 KB
実行使用メモリ 7,720 KB
最終ジャッジ日時 2025-09-26 09:50:04
合計ジャッジ時間 7,926 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 23
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  ll n; 
  if (!(cin >> n)) return 0;
  vector<ll> b(n);
  for (ll i = 0; i < n; ++i) cin >> b[i];

  // n の有効ビット数 L(0..L-1 が i の影響する桁)
  int L = 0;
  while ((1LL << L) <= n) ++L;

  // 各桁の x の値を -1(未確定)/0/1 で管理
  vector<int> xbit(L, -1);

  for (ll i = 1; i <= n; ++i) {
    ll bi = b[i-1];
    for (int k = 0; k < L; ++k) {
      int ik = (i >> k) & 1;
      int bk = (bi >> k) & 1;

      if (ik == 0) {
        // (i & x) の k 桁は必ず 0。bk が 1 なら矛盾。
        if (bk == 1) {
          cout << -1 << '\n';
          return 0;
        }
      } else {
        // ik == 1 のとき (i & x)_k = x_k なので、bk が x_k を規定
        if (xbit[k] == -1) xbit[k] = bk;
        else if (xbit[k] != bk) {
          cout << -1 << '\n';
          return 0;
        }
      }
    }
    // L 以上の上位桁は i 側が常に 0 なので、b_i 側が 0 以外なら矛盾
    if ((bi >> L) != 0) {
      cout << -1 << '\n';
      return 0;
    }
  }

  // 最小の x を作る(未確定桁は 0 にする)
  long long x = 0;
  for (int k = 0; k < L; ++k) if (xbit[k] == 1) x |= (1LL << k);

  // 「最小の正の整数 x」なので、x==0 なら L 桁目を 1 に
  if (x == 0) x = (1LL << L);

  cout << x << '\n';
  return 0;
}
0