MEX - OR

MEX (số nhỏ nhất không có) của một dãy là số nguyên không âm nhỏ nhất không có trong dãy. Ví dụ:

+ MEX của \(\lbrack 2,2,1\rbrack\) là 0, bởi 0 không có trong dãy.

+ MEX của \(\lbrack 3,1,0,1\rbrack\) là 2, bởi 0 và 1 thuộc dãy, nhưng 2 thì không.

+ MEX của [0, 3, 1, 2] là 4 bởi 0, 1, 2 và 3 thuộc dãy, nhưng 4 thì không.

Tìm số MEX lớn nhất của một dãy các số nguyên không âm sao cho phép OR bit của tất cả các phần tử trong dãy không vượt quá \(X\).

Dữ liệu vào:

+ Dòng đầu tiên ghi số nguyên \(t\ (1 \leq t \leq 10^{5})\) cho biết số test.

+ \(t\) dòng tiếp theo, mỗi dòng ghi một số nguyên \(x\ (0 < x < 10^{9})\).

Kết quả:

+ Với mỗi test in ra một dòng chứa MEX lớn nhất có thể có của dãy thỏa mãn tính chất đã cho.

Ví dụ:

Input Output
4
0
1
2
5
1
2
2
4

Solution:

Với tính chất của MEX ta suy ra dãy số cần tìm phải là dãy liên tục \(\lbrack 0,1,2,\ldots,i\rbrack\), lúc đó MEX là \(i + 1\). Như vậy ta sẽ tìm \(i\) sao cho \(0|1|\ldots|i\) là lớn nhất không vượt quá \(X\).

Phép Or của \(i\) số tự nhiên đầu tiên như sau

0 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20
0 1 3 3 7 7 7 7 15 15 15 15 15 15 15 31 31 31 31 31

Ta thấy:

+ \(i\) càng lớn thì giá trị của phép OR càng lớn

+ Giá trị của phép OR có dạng \(2^{k} - 1\)

Do vậy:

+ Nếu \(X = 2^{k} - 1\) thì kết quả cần tìm là \(2^{k}\)

+ Nếu \(X < 2^{k} - 1\) thì kết quả là \(2^{k} - 1\), trong đó \(k\) là số nhỏ nhất có thể

Bạn cần đăng nhập để nộp bài

hpcode.edu.vn
Code tích cực
Trong 24h
  1. trungnam (6/7)
  2. sythai (5/8)
  3. npk1605 (5/10)
Trong 7 ngày
  1. nguyenanhvu (40/64)
  2. khieuquan (35/59)
  3. ngokhang (27/55)
Trong 30 ngày
  1. quechi (85/105)
  2. dangphong3108 (79/125)
  3. kiennhientv (79/179)
Thống kê
AC/Sub: 97887/180710
Pascal: 17121
C++: 130348
Python: 33199
Lượt xem/tải tests: 38905

Lưu Hải Phong - 2020
[email protected]