trang chủ / đề bài / dhbb14_lexp

Biểu thức logic

Đề bài

Mô tả

Một biểu thức logic là biểu thức gồm các biến (được kí hiệu bằng các chữ cái in thường, nhận giá trị là số nguyên 32 bit không dấu) với các toán tử logic AND, OR, XOR và các dấu ngoặc. Các toán tử thực hiện theo từng bit (như các toán tử &, |, ^ trong C++). Một biểu thức hợp lệ được định nghĩa như sau:

  • Nếu x,y là biến thì: x là biểu thức hợp lệ; y là biểu thức hợp lệ; (x AND y), (x OR y), (x XOR y) là các biểu thức hợp lệ.
  • Nếu A,B là biểu thức hợp lệ thì: (A AND B), (A OR B), (A XOR B) là các biểu thức hợp lệ.

Ví dụ: x và ((x AND y) OR z) là các biểu thức hợp lệ; (x AND y là biểu thức không hợp lệ vì thiếu dấu ngoặc đóng; (x AND y) OR z là biểu thức không hợp lệ vì thiếu cặp dấu ngoặc bao ở ngoài cùng.

Trong bài toán này chỉ xét biểu thức hợp lệ mà mỗi biến chỉ xuất hiện một lần.

Yêu cầu: Cho một phương trình có dạng "F=P0" trong đó F là một biểu thức hợp lệ và P0 là một số nguyên 32 bit không dấu. Hãy đếm số các bộ giá trị của các biến (chỉ xét các biến có mặt trong F, mỗi biến nhận một giá trị trong đoạn [0,232−1]) để khi thay vào biểu thức F, ta thu được một đẳng thức đúng.

Dữ liệu vào

Dòng đầu tiên ghi số nguyên dương K là số lượng bộ dữ liệu. Tiếp đến là K dòng, mỗi dòng (tương ứng với một bộ dữ liệu) chứa một xâu có dạng "F=P0" trong đó F là một biểu thức hợp lệ.

Trong biểu thức, mỗi toán tử được viết bằng chữ in hoa (AND, OR, XOR) và có đúng một dấu cách ở mỗi bên; dấu ngoặc viết liền với biến hoặc dấu ngoặc bên cạnh; dấu = có đúng một dấu cách ở mỗi bên.

Dữ liệu ra

Gồm K dòng, mỗi dòng ghi một số nguyên là phần dư của phép chia số lượng các bộ giá trị để phương trình đúng cho 1000000009 (109+9), tương ứng với các bộ dữ liệu theo thứ tự trong dữ liệu vào.

Ràng buộc

  • 1≤K≤1000.
  • Số lượng biến trong mỗi biểu thức là n với 1≤n≤26; các biến là các chữ cái in thường đôi một khác nhau.
  • 0≤P0<232.

Subtasks

  • Subtask 1 (15 điểm): biểu thức chỉ chứa phép OR, n≤8 và 0≤P0<8.
  • Subtask 2 (20 điểm): biểu thức chỉ chứa phép OR, n≤26 và 0≤P0<8.
  • Subtask 3 (15 điểm): n≤26 và mỗi biểu thức chỉ chứa toàn phép AND hoặc chỉ chứa toàn phép XOR.
  • Subtask 4 (20 điểm): n≤26 và 0≤P0<232.

Biểu thức chỉ gồm một biến (không có toán tử) thỏa mãn điều kiện về phép toán của mọi subtask.

Ví dụ

Input Output Giải thích
3
(a OR b) = 2
(a OR (b OR c)) = 3
(x XOR y) = 2
3
49
294967260
Với (a OR b)=2: bit 1 có 3 cách (ít nhất một trong hai biến có bit 1), các bit còn lại bắt buộc cả hai bằng 0, nên có 3 bộ. Với (x XOR y)=2: mỗi x cho đúng một y=x XOR 2, có 232=4294967296 bộ, phần dư là 294967260.
3
c = 7
(d OR (e OR f)) = 0
((p OR q) OR (r OR s)) = 5
1
1
225
Ví dụ bổ sung. Một biến chỉ có một giá trị thỏa mãn. Phép OR bằng 0 khi mọi biến bằng 0. Với P0=5: bit 0 và bit 2 mỗi bit có 24−1=15 cách, nên có 152=225 bộ.
3
((a AND b) AND c) = 4294967295
(a AND b) = 0
(a XOR (b XOR c)) = 123
1
172174661
688856453
Ví dụ bổ sung. Phép AND bằng 232−1 khi mọi biến bằng 232−1. Với (a AND b)=0: mỗi bit có 3 cách, có 332 bộ. Phép XOR của ba biến: chọn tự do a,b, còn c xác định duy nhất, có 264 bộ.
3
((a OR b) AND c) = 1
(a OR (b AND c)) = 1
((a XOR b) AND (c OR d)) = 2147483648
631292848
953624441
956260009
Ví dụ bổ sung, trộn các phép toán. Với ((a OR b) AND c)=1: ở bit 0 cần c=1 và ít nhất một trong a,b bằng 1 (3 cách), ở mỗi bit khác giá trị phải là 0 (8−3=5 cách), nên có 3·531 bộ. Hai phương trình sau lần lượt có 5·331 và 6·1031 bộ.

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.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0