排列
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

给定一个正整数  和一个长度为  的排列 ,你可以进行若干次以下操作:

  • 选择一个  使得  然后交换  和 

求最后能得到多少种本质不同的排列。

两个排列本质不同,当且仅当他们至少有一个位置上的元素不同。

答案对  取模。

输入描述:

第一行一个整数  。

第二行  个整数表示一个序列  。

保证输入的  是一个  的排列。

输出描述:

一行一个整数表示答案。
示例1

输入

复制
4
1 3 2 4

输出

复制
5

说明

一共能得到这  种排列: 。