#include <bits/stdc++.h>
const int mod=1e9+7;
using namespace std;
int n,fac[50],C[50][50],tr[50][50],p[50],cnt[50],pre[50],q[125000],w[125000],t=0,sz[125000],dp[125000];
bool vis[50];
void init(int N){
	pre[0]=fac[0]=1;
	for(int i=1;i<=N;i++) fac[i]=1ll*i*fac[i-1]%mod;
	C[0][0]=1;
	for(int i=1;i<=N;i++){
		C[i][0]=1;
		for(int j=1;j<=N;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod; 
	}
	for(int i=0;i<n;i++){
		tr[i][0]=1;
		for(int j=0;j<=i;j++) tr[i][1]=(tr[i][1]+1ll*C[i][j]*fac[j]%mod*fac[n-j-1])%mod;
		for(int j=2;j<=N;j++) tr[i][j]=1ll*tr[i][j-1]*tr[i][1]%mod;
	} 
	for(int i=1;i<=n;i++){
		if(vis[i]) continue;
		int l=0,u=i;
		for(;!vis[u];l++,u=p[u]) vis[u]=true;
		++cnt[l];
	}
	for(int i=1;i<=n;i++) pre[i]=1ll*pre[i-1]*(cnt[i]+1);
	dp[0]=1;
	for(int S=0;S<pre[n];S++){
		t=0;
		q[++t]=0,w[t]=mod-1;
		for(int i=1;i<=n;i++){
			int lst=t;
			int lim=(S/pre[i-1])%(cnt[i]+1);
			sz[S]+=i*lim;
			for(int o=1;o<=lst;o++) for(int j=1;j<=lim;j++){
				q[++t]=q[o]+j*pre[i-1];
				w[t]=1ll*w[o]*(j&1?mod-1:1)%mod*C[lim][j]%mod;
			}
		}
		for(int i=2;i<=t;i++) dp[S]=(dp[S]+1ll*dp[S-q[i]]*w[i]%mod*tr[sz[S]-sz[q[i]]][sz[q[i]]])%mod;
	}
	printf("%d\n",dp[pre[n]-1]);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&p[i]);
	init(40);
}