#include<bits/stdc++.h>
#define int long long
const int mod = 1e9 + 7;
using namespace std;
struct node{
int to, next;
}k[1000005];
int head[1000005], tot = 1, dfn[100005], ans, size;
bool vis[1000005];
inline int add(int a, int b){
k[++tot].to = b;
k[tot].next = head[a];
head[a] = tot;
}
void dfs(int now, int val){
size++;
dfn[now] = val;
// vis_[now] = true;
for(register int i = head[now]; i; i = k[i].next){
//cout << 1 << "\n";
if(vis[i ^ 1] == true or vis[i] == true) continue;
if(dfn[k[i].to] != 0){
ans = abs(dfn[now] - dfn[k[i].to]) + 1;
vis[i] = true, vis[i ^ 1] = true;
//cout << dfn[now] << " " << dfn[k[i].to] << "\n";
return;
}
vis[i] = true, vis[i ^ 1] = true;
dfs(k[i].to, dfn[now] + 1);
}
return;
}
int times(int x){
int sum = 1, now = 2;
while(x){
if(x & 1) sum *= now;
sum %= mod;
now *= now;
now %= mod;
x >>= 1;
}
return sum;
}
signed main(){
int n, a, sum = 1;
scanf("%lld", &n);
for(register int i = 1; i <= n; i++){
scanf("%lld", &a);
add(a, i), add(i, a);
}
for(register int i = 1; i <= n; i++){
if(dfn[i] == 0){
size = 0;
dfs(i, 1);
// cout << "s" << "\n";
//cout << size << " " << ans << "\n";
sum *= times(size) - times(size - ans + 1);
sum %= mod;
}
}
printf("%lld\n", sum);
}
蒟蒻调的快吐了,嘤嘤嘤