#include<bits/stdc++.h>
#define maxn 200005
#define mod 1000000007
using namespace std;
int deg[maxn],a[maxn],incy[maxn],vis[maxn],svis[maxn],n;
int chlen[maxn],cnt[maxn];
int ans=1;
int add(int a,int b){a+=b; return a>=mod?a-mod:a;}
void SolveCyc(int x)
{
	int t=x; x=a[x],svis[t]=svis[x]=1;
	int fi=0,fpos=0,la=0,len=1;
	while(1)
	{
		while(!chlen[x]&&x!=t) x=a[x],svis[x]=1,len++;
		if(chlen[x])
		{
			if(!fi) fi=x,la=len,fpos=len;
			else
			{
				int coef=(len-la>=chlen[x])+(len-la>chlen[x]);
				ans=1ll*ans*coef%mod,la=len;
			}
		}
		if(x==t) break;
		x=a[x],svis[x]=1,len++;
	}
	if(chlen[t])
	{
		if(!fi) fi=t;
		else la=len;
	}
	if(!fi) cnt[len]++;
	else
	{
		int coef=(len-la+fpos>=chlen[fi])+(len-la+fpos>chlen[fi]);
		ans=1ll*ans*coef%mod;
	}
}
int dp[maxn];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),deg[a[i]]++;
	for(int i=1;i<=n;i++)
	{
		if(vis[i]) continue;
		int nw=i; while(!vis[nw]) vis[nw]=i,nw=a[nw];
		if(vis[nw]!=i) continue;
		int t=nw; incy[nw]=1,nw=a[nw];
		while(nw!=t) incy[nw]=1,nw=a[nw];
	}
	for(int i=1;i<=n;i++)
		if(((!incy[i])&&deg[i]>=2)||deg[i]>=3) return puts("0"),0;
	for(int i=1;i<=n;i++)
	{
		if(deg[i]) continue;
		int nw=i; while(!incy[nw]) chlen[a[nw]]=chlen[nw]+1,nw=a[nw];
	}
	for(int i=1;i<=n;i++)
		if(incy[i]&&!svis[i]) SolveCyc(i);
	for(int i=1;i<=n;i++)
	{
		if(!cnt[i]) continue;
		dp[0]=1;
		for(int j=1;j<=cnt[i];j++)
		{
			if(i>1&&(i&1)) dp[j]=add(dp[j-1],dp[j-1]);
			else dp[j]=dp[j-1];
			if(j>1) dp[j]=add(dp[j],1ll*dp[j-2]*(j-1)%mod*i%mod);
		}
		ans=1ll*ans*dp[cnt[i]]%mod;
	}
	printf("%d\n",ans);
	return 0;
}
 