trang chủ / đề bài / voi25_encode

Mã hóa dãy số

Đề bài

Mô tả

Ngày nay, lĩnh vực an ninh mạng đang dần trở thành một lĩnh vực thiết yếu trong việc bảo mật an toàn thông tin trên toàn thế giới. Tuấn là một kỹ sư an ninh mạng và rất đam mê khám phá các bài toán về mã hóa bảo mật. Cậu đang quan tâm đến bài toán mã hóa một dãy số S=(S1,S2,…,SN) với các phần tử là số nguyên dương không quá K. Cậu thử nghiệm việc mã hóa bằng cách viết ra tất cả các dãy hậu tố của dãy S. Cụ thể, với mỗi i∈{1,2,…,N}, Tuấn viết ra dãy Ai=(Si,Si+1,…,SN). Sau đó, cậu sắp xếp các dãy này tăng dần theo thứ tự từ điển. Cuối cùng, cậu ghi lại độ dài của các dãy theo thứ tự đã sắp xếp, thu được dãy L=(L1,L2,…,LN) và gọi đây là dãy đặc trưng của S.

Ví dụ, với dãy S=(2,1,4,3,1,3,4) thì Tuấn sẽ viết ra 7 dãy: A1=(2,1,4,3,1,3,4); A2=(1,4,3,1,3,4); A3=(4,3,1,3,4); A4=(3,1,3,4); A5=(1,3,4); A6=(3,4); A7=(4). Sau khi sắp xếp tăng dần theo thứ tự từ điển, Tuấn thu được: (A5,A2,A1,A4,A6,A7,A3). Cuối cùng, Tuấn ghi lại độ dài các dãy theo thứ tự đó và thu được dãy đặc trưng của S là L=(3,6,7,4,2,1,5).

Nhắc lại, dãy (X1,X2,…,Xu) được gọi là đi trước dãy (Y1,Y2,…,Yv) theo thứ tự từ điển nếu một trong hai điều kiện sau thỏa mãn:

  • Tồn tại i∈{1,2,…,min(u,v)} sao cho X1=Y1,X2=Y2,…,Xi−1=Yi−1 và Xi<Yi;
  • X1=Y1,X2=Y2,…,Xu=Yu và u<v.

Bây giờ Tuấn muốn biết khả năng giải mã ngược lại ra dãy S nếu chỉ biết số K, dãy L và phương pháp xây dựng dãy L. Tuấn nhận ra rằng có thể tồn tại nhiều dãy S có các phần tử là các số nguyên dương không quá K mà sau khi thực hiện phương pháp mã hóa như trên có thể cho ra cùng một dãy đặc trưng L.

Tiếp tục quá trình thử nghiệm, Tuấn thực hiện Q phép biến đổi liên tiếp trên dãy L. Với mỗi phép biến đổi, cậu sẽ chọn hai phần tử của dãy L hiện tại và đổi giá trị cho nhau, sau đó đếm số dãy S thỏa mãn dãy đặc trưng L vừa được biến đổi. Sau mỗi phép biến đổi, dãy L được cập nhật.

Yêu cầu: Cho biết N,K, dãy L và các phép biến đổi của Tuấn. Trước lần biến đổi đầu tiên và sau mỗi lần biến đổi của Tuấn trên dãy L, hãy tính số lượng dãy S có N phần tử, các phần tử là các số nguyên dương không quá K, sao cho dãy đặc trưng của S là dãy L.

Dữ liệu vào

  • Dòng đầu tiên chứa ba số nguyên N,K,Q (1≤N,K≤5×105; 0≤Q≤5×105).
  • Dòng thứ hai chứa N số nguyên dương L1,L2,…,LN. Dữ liệu đảm bảo dãy L=(L1,L2,…,LN) là một hoán vị của N số tự nhiên 1,2,…,N.
  • Mỗi dòng trong số Q dòng tiếp theo chứa hai số nguyên dương khác nhau i,j (1≤i,j≤N) mô tả một phép biến đổi của Tuấn với ý nghĩa là đổi giá trị của Li và Lj cho nhau.

Các số trên cùng một dòng cách nhau bởi dấu cách.

Dữ liệu ra

Gồm Q+1 dòng, mỗi dòng là phần dư trong phép chia cho 1000000007 của số lượng dãy S tính được cho dãy L ban đầu và cho dãy L sau mỗi phép biến đổi theo thứ tự đầu vào.

Ràng buộc

  • 1≤N,K≤5×105; 0≤Q≤5×105.
  • L là một hoán vị của 1,2,…,N.
  • Mỗi phép biến đổi: 1≤i,j≤N, i≠j.

Subtasks

  • Subtask 1 (10% số điểm): N,K,Q≤8.
  • Subtask 2 (10% số điểm): N,Q≤8.
  • Subtask 3 (24% số điểm): Q=0 và L là dãy tăng dần hoặc giảm dần.
  • Subtask 4 (28% số điểm): N,K,Q≤1000.
  • Subtask 5 (28% số điểm): Không có ràng buộc nào thêm.

Ví dụ

Input Output Giải thích
3 3 2
3 1 2
2 3
1 2
4
4
1
Các dãy S có dãy đặc trưng L=(3,1,2) là: (1,2,2); (1,3,3); (2,3,3); (1,3,2). Các dãy S có dãy đặc trưng L=(3,2,1) là: (1,1,2); (1,1,3); (2,2,3); (1,2,3). Các dãy S có dãy đặc trưng L=(2,3,1) là: (2,1,3).
7 4 2
3 6 7 4 2 1 5
3 7
1 6
1
1
8
Ví dụ bổ sung (không có trong đề gốc). Với K=4, dãy L=(3,6,7,4,2,1,5) chỉ ứng với đúng dãy S=(2,1,4,3,1,3,4) ở đề bài. Sau phép đổi thứ nhất, L=(3,6,5,4,2,1,7) chỉ ứng với S=(4,2,2,3,1,3,4). Sau phép đổi thứ hai, L=(1,6,5,4,2,3,7) ứng với 8 dãy, chẳng hạn (3,1,1,1,2,2,1).

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