結果

問題 No.5001 排他的論理和でランニング
ユーザー letrangerjpletrangerjp
提出日時 2018-03-24 18:09:01
言語 C
(gcc 13.3.0)
結果
AC  
実行時間 274 ms / 1,500 ms
コード長 979 bytes
コンパイル時間 106 ms
実行使用メモリ 6,148 KB
スコア 52,428,750
最終ジャッジ日時 2020-03-12 20:22:22
ジャッジサーバーID
(参考情報)
judge9 /
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 50
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static unsigned long y = 2463534242;
unsigned long xorshift(void) {
  y = y ^ (y << 13); y = y ^ (y >> 17);
  return y = y ^ (y << 5);
}

int main(void) {
  y = time(NULL);
  int N, M, A[100000], used[100000] = {0};
  scanf("%d%d\n", &N, &M);
  for (int i = 0; i < N; ++i) {
    scanf("%d", &A[i]);
  }

  int curr = 0;
  for (int i = 0; i < M; ++i) {
    curr ^= A[i];
    used[i] = 1;
  }
  for (int i = 0; i < 10000000; ++i) {
    int from, to;
    do { from = xorshift()%N; } while(!used[from]);
    used[from] = 0;
    do { to = xorshift()%N; } while(used[to]);
    used[to] = 1;
    curr ^= A[from] ^ A[to];
    if (curr == (1<<20) - 1) {
      break;
    }
  }
  // printf("%d\n", curr);
  int cnt = 0;
  for (int i = 0; i < N; ++i) {
    if (used[i] != 0) {
      printf("%d", A[i]);
      ++cnt;
      if (cnt < M) {
        putchar(' ');
      } else {
        putchar('\n');
        break;
      }
    }
  }
}
0