兔子的排列
题号:NC21348
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

牛牛有N张牌,每张牌上有一个数字,所有牌上的数字构成了一个完整的0到N-1的排列
现在牛牛将牌从左往右放在桌子上,第i张牌(从0开始)上面写的是i
牛牛想要调整牌的顺序使得第i张牌上面的数字是p[i]
调整策略如下
有N-1只兔子,兔子的标号为0到N-2,第i只兔子可以交换第i与i+1张牌
一个兔子的排列q[0],q[1]..q[N-2]被称为一个好排列当且仅当,按照这个排列的顺序让兔子们去交换牛牛的牌,操作结束后第i张牌恰好是p[i]
请问一共有多少的好排列,答案 对1e9+7取模

输入描述:

第一行输入一个整数N (2 ≤ N ≤ 50)
第二行输入N个整数表示0到N-1的一个排列

输出描述:

输出一个整数
示例1

输入

复制
3
1 2 0

输出

复制
1
示例2

输入

复制
2
0 1

输出

复制
0
示例3

输入

复制
4
2 0 3 1

输出

复制
2
示例4

输入

复制
4
1 0 3 2

输出

复制
0
示例5

输入

复制
20
1 3 0 5 2 7 4 8 10 6 12 9 14 11 16 13 18 15 19 17

输出

复制
716743312

备注:

子任务1: N <= 6
子任务2: N <= 10
子任务3: 无限制