#include<bits/stdc++.h>
#define int long long
const int mod=1e9+7;
using namespace std;
inline int read(){
char ch=getchar();int s=0,f=1;
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') ch=getchar(),f=-1;
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return f*s;
}
int N,h[1000010],cnt=1,n,m,vis[1000010],cao[1000010],ans=1;
struct node{
int u,v,nxt;
}e[1000010];
void add(int u,int v){
e[++cnt].u=u;
e[cnt].v=v;
e[cnt].nxt=h[u];
h[u]=cnt;
}
void dfs(int now,int fa,int tot){
if(!vis[now])
n++;
cao[now]=1;
if(m)
return ;
if(vis[now]){
m=tot-vis[now];
return ;
}
vis[now]=tot;
for(int i=h[now];i;i=e[i].nxt)
if((i^1)!=fa)
dfs(e[i].v,i,tot+1);
}
int ksm(int x,int y,int z){
int ans=1;
while(y){
if(y&1){
ans*=x;
ans%=z;
}
x*=x;
x%=z;
y>>=1;
}
return ans;
}
signed main(){
N=read();
for(int i=1;i<=N;i++){
int u=read();
add(i,u);
add(u,i);
}
for(int i=1;i<=N;i++)
if(!cao[i]){
m=0;
n=0;
dfs(i,0,1);
ans*=ksm(2,n,mod)-ksm(2,n-m+1,mod);
ans%=mod;
}
cout<<ans%mod;
return 0;
}