Theo dõi tiến độ

Đề bài

Mô tả

Cho một cây T gồm n đỉnh được đánh số từ 1 đến n, biểu diễn bằng ma trận kề a[1…n][1…n]. Người ta chạy đoạn mã giả sau trên cây đó:

used[1 ... n] = {0, ..., 0};

procedure dfs(v):
    print v;
    used[v] = 1;
    for i = 1, 2, ..., n:
        if (a[v][i] == 1 and used[i] == 0):
            dfs(i);

dfs(1);

Kết quả in ra là một dãy n số, chính là thứ tự các đỉnh được thăm.

Cho trước dãy b1,b2,…,bn. Hãy đếm số cây T khác nhau sao cho đoạn mã giả trên in ra đúng dãy b.

Hai cây n đỉnh được coi là khác nhau nếu ma trận kề của chúng khác nhau, tức là tồn tại cặp (i,j) với 1≤i,j≤n mà a1[i][j]≠a2[i][j].

Vì kết quả có thể rất lớn, hãy in ra phần dư của nó khi chia cho 109+7.

Dữ liệu vào

  • Dòng đầu chứa số nguyên dương n là độ dài của dãy b.
  • Dòng thứ hai chứa n số nguyên dương b1,b2,…,bn.

Dữ liệu ra

Một số nguyên duy nhất: số cây thoả mãn, lấy phần dư khi chia cho 109+7.

Ràng buộc

  • 1≤n≤500
  • 1≤bi≤n
  • b là một hoán vị của 1,2,…,n
  • b1=1

Ví dụ

Input Output Giải thích
3
1 2 3
2 Có hai cây thoả mãn: đường thẳng 1−2−3, và hình sao với đỉnh 1 nối tới cả 2 và 3. Với hình sao, vòng lặp tại đỉnh 1 duyệt i tăng dần nên thăm 2 trước rồi mới tới 3.
3
1 3 2
1 Chỉ có đường thẳng 1−3−2. Hình sao bị loại vì tại đỉnh 1 vòng lặp luôn thăm 2 trước 3, cho ra dãy 1 2 3.

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