Hướng dẫn giải của Bedao Grand Contest 14 - Reverse Digit


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Giả sử ~n~ lẻ, chúng ta xét hàng chính giữa (hàng ~(n+1)/2~). Hàng này không bị ảnh hưởng bởi các thao tác khác, ngoại trừ thao tác đảo chính hàng này. Khi đó đáp án bằng (~2\ \times~ số bảng tạo được mà không xét đến hàng chính giữa) nếu hàng này không đối xứng, và bằng (số bảng tạo được mà không xét đến hàng chính giữa) nếu ngược lại. Tương tự như vậy với trường hợp ~m~ lẻ.

Trong phần còn lại của lời giải, chúng ta chỉ xét trường hợp ~n~ và ~m~ đều chẵn.


Xét cặp ~(i,j)~ ~(1 \le i \le n/2~ , ~1 \le j \le m/2)~ bất kỳ, dãy các thao tác sau đây:

  1. Đảo hàng ~i~
  2. Đảo cột ~j~
  3. Đảo hàng ~i~
  4. Đảo cột ~j~

sẽ "xoay" 3 chữ số ~a[i][j]~, ~a[i][m+1-j]~, ~a[n+1-i][j]~ theo vòng tròn 1 vị trí mà không làm thay đổi vị trí các chữ số khác trong bảng. Bằng các thao tác tương tự, chúng ta có thể chọn 3 trong số 4 chữ số ~a[i][j]~, ~a[i][m+1-j]~, ~a[n+1-i][j]~, ~a[n+1-i][m+1-j]~ để "xoay" vòng tròn. Chúng ta gọi nhóm 4 chữ số này là nhóm ~(i,j)~.

~\implies~ Từ vị trí ban đầu, ta có thể tạo được các hoán vị chẵn của nhóm ~(i,j)~ mà không ảnh hưởng đến các nhóm khác.

Đồng thời cũng có thể chứng minh được rằng: ta không thể tạo được các hoán vị lẻ của nhóm ~(i,j)~ mà không ảnh hưởng đến các nhóm khác.

(Một hoán vị chẵn là một hoán vị tạo được bằng ~1~ số chẵn lần hoán đổi ~2~ phần tử. Hoán vị lẻ được định nghĩa tương tự)


Chúng ta phân loại các nhóm như sau:

Loại 1: Các nhóm mà cả ~4~ chữ số đều đôi một phân biệt. Ở loại này các hoán vị lẻ hoàn toàn phân biệt với các hoán vị chẵn.

Loại 2: Các nhóm mà trong đó có ~2~ chữ số giống nhau. Ở loại này, bất kỳ hoán vị lẻ nào đều có hoán vị chẵn tương ứng mà giống nó và ngược lại (bằng cách hoán đổi ~2~ chữ số giống nhau), vì vậy việc chỉ tạo được hoán vị chẵn hay lẻ không có ý nghĩa gì ở đây.

Từ các nhận xét trên, ta tạo bảng ~b[i][j]~, trong đó:

~b[i][j] = -1~ nếu nhóm ~(i,j)~ thuộc loại ~2~

~b[i][j] = 0~ nếu nhóm ~(i,j)~ thuộc loại ~1~, và hiện tại chúng ta chỉ tạo được hoán vị chẵn với nhóm này

~b[i][j] = 1~ nếu nhóm ~(i,j)~ thuộc loại ~1~, và hiện tại chúng ta chỉ tạo được hoán vị lẻ với nhóm này

Nhận xét rằng đảo hàng ~k~ (hoặc hàng ~n+1-k~) sẽ thay đổi các ~b[i][j]~ ở hàng k (với các nhóm ~(i,j)~ thuộc loại ~1~) từ ~0~ thành ~1~ và ngược lại. Tương tự với việc đảo cột ~k~ (hoặc cột ~m+1-k~)

Khi đó đáp án sẽ bằng số bảng ~b~ khác nhau tạo được, nhân với tích ~c[i][j]~, trong đó:

~c[i][j] = 4!/2 = 12~, nếu nhóm ~(i,j)~ thuộc loại ~1~ (vì chúng ta chỉ tạo được hoán vị chẵn hoặc hoán vị lẻ)

~c[i][j] =~ số hoán vị khác nhau tạo được ở nhóm này, nếu nhóm ~(i,j)~ thuộc loại ~2~.


Để đếm số bảng ~b~ khác nhau tạo được, ta lập thêm ~2~ mảng:

~\text{row}[k]~ = số lần hàng ~k~ đã được đảo modulo ~2~

~\text{col}[k]~ = số lần cột ~k~ đã được đảo modulo ~2~

Khi đó ~b[i][j] = \text{row}[i] \oplus \text{col}[j]~ nếu nhóm ~(i,j)~ thuộc loại ~1~.

Từ nhận xét này, ta lập đồ thị với các đỉnh ~r_1~ ... ~r_{n/2}~ ~c_1~ ... ~c_{m/2}~, trong đó mỗi đỉnh có trọng số là ~0~ hoặc ~1~. Với mỗi nhóm ~(i,j)~ thuộc loại ~1~, ta thêm cạnh giữa ~r_i~ và ~c_j~ có trọng số là ~\text{XOR}~ trọng số của ~2~ đỉnh này. Nhiệm vụ bây giờ chuyển thành: Đếm số cấu hình trọng số cạnh khác nhau có thể tạo được.

Dễ thấy rằng bài toán có thể phân tách thành các thành phần liên thông.

Với mỗi thành phần liên thông, lấy ~1~ cây khung ~T~ bất kỳ. Chúng ta có thể gán trọng số bất kỳ cho các cạnh thuộc ~T~, và với các cạnh ngoài ~T~ chúng ta tính được trọng số từ trọng số các cạnh thuộc ~T~. Như vậy đáp án sẽ bằng ~2^{V-1}~ trong đó ~V~ là số đỉnh trong thành phần liên thông.


Độ phức tạp: ~\mathcal{O}(nm)~


Bình luận

Hãy đọc nội quy trước khi bình luận.


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