[COCI1920 - Contest 02] Bài 4: Popcount

Xem PDF

Nộp bài

Điểm: 100 (thành phần)
Thời gian: 1.0s
Bộ nhớ: 512M
Input: bàn phím
Output: màn hình

Tác giả:
Dạng bài

Miniature Algebraic Natural Relay (còn gọi là MALNAR) là bước tiến công nghệ mới nhất trong lĩnh vực thiết bị lập trình nhỏ. Bạn có thể viết chương trình của riêng mình cho thiết bị này bằng ngôn ngữ lập trình MalnarScript, một ngôn ngữ lập trình độc đáo với các tính năng sau:

  • Đầu vào của chương trình là một số nguyên không âm nhỏ hơn ~2^N~.
  • Đầu ra của chương trình là một số nguyên không âm nhỏ hơn ~2^N~.
  • Khi lập trình trong MalnarScript, bạn chỉ có thể sử dụng một biến số nguyên không dấu ~N~-bit tên là A. Ở đầu chương trình, biến này chứa giá trị đầu vào và giá trị của nó ở cuối chương trình được coi là đầu ra của chương trình.
  • Mã nguồn của MalnarScript phải bao gồm tối đa ~K~ lệnh dưới dạng A=<biểu thức> được thực hiện theo thứ tự và mỗi lệnh phải bao gồm tối đa một nghìn ký tự. Ký hiệu <biểu thức> được định nghĩa đệ quy như sau:

    ~<biểu thức> = A | <số> | (<biểu thức><toán tử><biểu thức>)~

Nói cách khác, ký hiệu ~<biểu thức>~ có thể là biến ~A~, hoặc có thể tuân theo định nghĩa của ký hiệu ~<số>~, hoặc có thể (bên trong dấu ngoặc đơn) biểu diễn một biểu thức hai thành phần mà mỗi toán hạng tuân theo cùng định nghĩa ~<biểu thức>~.

Ký hiệu ~<số>~ trong định nghĩa trên đại diện cho một số nguyên thập phân không âm nhỏ hơn ~2^N~, trong khi ký hiệu ~<toán tử>~ có thể là ~+~, ~-~, ~|~, ~&~, ~<<~ hoặc ~>>~ tương ứng (theo thứ tự) với các phép toán cộng, trừ, hoặc bitwise, và bitwise, dịch trái và dịch phải.

Ngoài ra, ký tự ~A~ có thể xuất hiện tối đa ~5~ lần trong ký hiệu ~<biểu thức>~.

Trong trường hợp tràn hoặc tràn âm khi thực hiện các phép toán cộng và trừ, MalnarScript sẽ thực hiện các phép toán đó theo modulo ~2^N~. Ví dụ, khi ~N = 3~, biểu thức ~(7 + 3)~ sẽ cho ra kết quả là ~2~ và biểu thức ~(2 - 5)~ sẽ cho ra kết quả là ~5~ trong MalnarScript.

Phía bên phải của phương trình trong mỗi lệnh sẽ đánh giá thành một số đơn và sau đó sẽ được lưu vào A. Để đánh giá biểu thức phía bên phải, MalnarScript đầu tiên thay thế mỗi lần xuất hiện của A bằng giá trị hiện tại của nó. Việc tính toán biểu thức sau đó sẽ tiến hành như trong bất kỳ biểu thức toán học nào, tức là các dấu ngoặc đơn có quyền ưu tiên. Lưu ý rằng thứ tự ưu tiên của các toán tử (theo thứ tự hoạt động) là không quan trọng vì kết quả cuối cùng được xác định hoàn toàn bởi vị trí của dấu ngoặc đơn.

Nhiệm vụ của bạn là viết một chương trình xuất ra một chương trình trong MalnarScript để tính số lượng các số ~1~ trong biểu diễn nhị phân của giá trị đầu vào.

Input

Dòng đầu tiên chứa hai số nguyên ~N~ và ~K~ từ mô tả bài toán.

Output

  • Trong dòng đầu tiên, bạn cần xuất ra số lượng lệnh của chương trình MalnarScript được tạo ra.
  • Trong các dòng còn lại, bạn cần xuất ra các lệnh của chương trình mong muốn. Mỗi lệnh phải được in ra một dòng riêng biệt và phải tuân theo cú pháp của MalnarScript như đã mô tả trong bài toán. Điều quan trọng là không có dòng trống không cần thiết hoặc ký tự khoảng trắng thừa trong đầu ra. Mỗi dòng (bao gồm cả dòng cuối) phải kết thúc bằng ký tự kết thúc dòng (’\n’).

Chú ý

  • ~15~ điểm thỏa mãn ~2 \leq N \leq 100, K = N − 1~
  • ~15~ điểm thỏa mãn ~N = 500, K = 128~.
  • ~35~ điểm thỏa mãn ~1 \leq N \leq 40, K = 7~.
  • ~45~ điểm thỏa mãn ~100 \leq N \leq 500, K = 10~.

Sample Input 1

2 2

Sample Ouput 1

1
A=(A-((A&2)>>1))

Sample Input 2

3 5

Sample Ouput 2

2
A=((A&4)|((A&3)-((A&2)>>1)))
A=((A&3)+((A&4)>>2))

Giải thích

Trong test đầu tiên

  • input = 0 ⇒ output = (0 − ((0&2) >> 1)) = (0 − (0 >> 1)) = (0 − 0) = 0
  • input = 1 ⇒ output = (1 − ((1&2) >> 1)) = (1 − (0 >> 1)) = (1 − 0) = 1
  • input = 2 ⇒ output = (2 − ((2&2) >> 1)) = (2 − (2 >> 1)) = (2 − 1) = 1
  • input = 3 ⇒ output = (3 − ((3&2) >> 1)) = (3 − (2 >> 1)) = (3 − 1) = 2

Bình luận đầu tiên

Bình luận

Không có bình luận nào.