JOI 2020 - Ruins 3
Xem PDFGiáo sư JOI là một chuyên gia hàng đầu về lịch sử Vương quốc IOI. Khi khảo sát một ngôi đền cổ trong vương quốc, ông tìm thấy một khu di tích từng có các cột đá. Ông cũng tìm thấy một tài liệu cổ được cho là do cư dân Vương quốc IOI thời xưa viết lại. Tài liệu mô tả các cột đá như sau:
- Ngay sau khi được dựng lên, có \(2N\) cột đá, được đánh số từ \(1\) đến \(2N\).
- Ngay sau khi được dựng lên, với mỗi \(k\) (\(1 \le k \le N\)), có đúng hai cột đá cao \(k\).
- Đã xảy ra \(N\) trận động đất. Sau mỗi trận, một số cột đá bị sụp một phần và chiều cao giảm đi \(1\). Những cột khác được người xưa bảo vệ nên không bị sụp và giữ nguyên chiều cao.
- Khi xảy ra động đất, với mỗi \(k\) (\(1 \le k \le N\)), người xưa bảo vệ đúng một cột đá cao \(k\). Nếu có nhiều cột cùng cao \(k\) vào thời điểm đó, cột có chỉ số lớn nhất được bảo vệ. Nói cách khác, nếu trước trận động đất cột \(i\) (\(1 \le i \le 2N\)) có chiều cao \(h_i\), thì cột \(i\) được bảo vệ khi và chỉ khi \(h_i \ge 1\) và \(h_j \ne h_i\) với mọi \(j>i\).
- Sau \(N\) trận động đất, còn lại \(N\) cột đá, tức là có đúng \(N\) cột có chiều cao ít nhất \(1\).
Giáo sư JOI cho rằng việc khôi phục chiều cao ban đầu của \(2N\) cột đá sẽ là một phát hiện lớn. Sau khi khảo sát kỹ hơn, ông xác định được các chỉ số của những cột còn lại sau \(N\) trận động đất là \(A_1,A_2,\ldots,A_N\).
Giáo sư muốn biết có bao nhiêu cách gán chiều cao ban đầu cho \(2N\) cột đá phù hợp với tài liệu cổ và thông tin đã tìm được. Là học trò của giáo sư, bạn được giao viết chương trình tính số cách đó, lấy số dư khi chia cho \(1\,000\,000\,007\).
Dữ liệu vào
Đọc từ đầu vào chuẩn theo dạng sau. Tất cả các giá trị đều là số nguyên.
N
A_1 ... A_N
Dữ liệu ra
In ra một dòng chứa số dư của số cách gán chiều cao ban đầu thỏa mãn yêu cầu khi chia cho \(1\,000\,000\,007\).
Ràng buộc
- \(1 \le N \le 600\).
- \(1 \le A_i \le 2N\) với \(1 \le i \le N\).
- \(A_i < A_{i+1}\) với \(1 \le i \le N-1\).
Phân nhóm
- (6 điểm) \(N \le 13\).
- (52 điểm) \(N \le 60\).
- (42 điểm) Không có ràng buộc bổ sung.
Ví dụ
Ví dụ 1
Input
3
3 4 6
Output
5
Giải thích
Ví dụ, giả sử chiều cao ban đầu của các cột theo thứ tự từ cột \(1\) là \((2,2,3,3,1,1)\). Với mỗi \(k\) (\(1 \le k \le 3\)), có đúng hai cột cao \(k\), phù hợp với mô tả trong tài liệu cổ.
- Trong trận động đất thứ nhất, các cột \(2,4,6\) được bảo vệ. Sau trận này, các chiều cao trở thành \((1,2,2,3,0,1)\).
- Trong trận động đất thứ hai, các cột \(3,4,6\) được bảo vệ. Sau trận này, các chiều cao trở thành \((0,1,2,3,0,1)\).
- Trong trận động đất thứ ba, các cột \(3,4,6\) được bảo vệ. Sau trận này, các chiều cao trở thành \((0,0,2,3,0,1)\).
Sau ba trận động đất, các cột còn lại là \(3,4,6\), đúng với thông tin trong đầu vào.
Ngoài cách trên, còn bốn cách gán chiều cao ban đầu: \((2,3,2,3,1,1)\), \((2,3,3,2,1,1)\), \((3,2,2,3,1,1)\) và \((3,2,3,2,1,1)\).
Vì vậy, có tất cả năm cách gán chiều cao ban đầu cho sáu cột đá phù hợp với tài liệu cổ và dữ liệu đầu vào.
Ví dụ 2
Input
1
1
Output
0
Giải thích
Chỉ có cách gán chiều cao ban đầu \((1,1)\) phù hợp với mô tả về các cột mới được dựng trong tài liệu cổ. Sau trận động đất thứ nhất, chiều cao của hai cột trở thành \((0,1)\).
Do đó, không có cách gán chiều cao ban đầu nào phù hợp đồng thời với tài liệu cổ và thông tin về cột còn lại trong đầu vào.
Ví dụ 3
Input
10
5 8 9 13 15 16 17 18 19 20
Output
147003663
Giải thích
Có \(111\,147\,004\,440\) cách gán chiều cao cho \(2N\) cột đá lúc mới được dựng. Khi chia số này cho \(1\,000\,000\,007\), số dư là \(147\,003\,663\). Vì vậy, cần in ra \(147\,003\,663\).
Nguồn
Bản dịch tiếng Việt từ đề chính thức bằng tiếng Anh của Ủy ban Olympic Tin học Nhật Bản, JOI 2019/2020, Trại huấn luyện mùa xuân, ngày thi thứ 2. Đề gốc và bản dịch được cung cấp theo giấy phép CC BY-SA 4.0.
Kỳ thi:
- JOI 2020 - Trại huấn luyện mùa xuân - Ngày 2 (21 Tháng ba, 2020)
Bình luận