Sinh tập hợp

Đề bài

Mô tả

Cho tập hợp Y gồm n số nguyên dương phân biệt y1,y2,,yn.

Một tập hợp X gồm n số nguyên dương phân biệt x1,x2,,xn được gọi là sinh ra Y nếu có thể biến đổi X thành Y bằng cách áp dụng hữu hạn lần một trong hai phép toán sau lên các phần tử của X:

  1. Chọn một phần tử xi bất kỳ và thay nó bằng 2·xi.
  2. Chọn một phần tử xi bất kỳ và thay nó bằng 2·xi+1.

Lưu ý rằng trong quá trình biến đổi, các phần tử của X không bắt buộc phải phân biệt. Tuy nhiên, ban đầu X phải gồm n số nguyên dương phân biệt, và sau toàn bộ quá trình biến đổi X phải bằng Y khi xét như tập hợp (tức là khi sắp xếp tăng dần thì hai dãy giống nhau).

Mọi tập hợp đều sinh ra chính nó.

Cho trước tập Y, hãy tìm tập X sinh ra Y sao cho phần tử lớn nhất của Xnhỏ nhất có thể.

Dữ liệu vào

  • Dòng đầu chứa số nguyên n — số phần tử của Y.
  • Dòng thứ hai chứa n số nguyên phân biệt y1,y2,,yn.

Dữ liệu ra

In ra n số nguyên phân biệt mô tả tập X tối ưu. Nếu có nhiều đáp án, in ra bất kỳ đáp án nào.

Ràng buộc

  • 1n50000
  • 1yi109
  • Các yi đôi một phân biệt.

Ví dụ

Input Output Giải thích
5
1 2 3 4 5
1 2 3 4 5 Y đã là tập tối ưu — không thể giảm phần tử lớn nhất xuống dưới 5.
6
15 14 3 13 1 12
1 3 7 12 13 14 Từ 7 ta áp dụng phép x2x+1 để được 15. Các phần tử còn lại giữ nguyên. Phần tử lớn nhất là 14.
6
9 7 13 17 5 11
1 2 3 4 5 6 Ví dụ: 124817, 37, 249, 613, 511, còn 5 giữ nguyên. Phần tử lớn nhất chỉ là 6.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0