//每个顶点只有一个出度
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=2e5+1;
int mod=1e9+7;
int cnt;
int s[maxn];
int vis[maxn],num[maxn];
queue<int> cycle;
long long pow(long long a,long long b,long long m) //必须为long long,否则wa
{
long long t=a%m,res=1;
while(b)
{
if(b&1){
res=res*t%m;
}
t=t*t%m;
b>>=1;
}
return res;
}
void dfs2(int u)
{
cnt++; //记录该环中节点的个数
vis[u]=3;
if(vis[s[u]]==3) return ;
dfs2(s[u]);
}
void dfs(int u)
{
vis[u]=2;
if(vis[s[u]]==0){
dfs(s[u]);
}
else if(vis[s[u]]==1)
{
vis[u]=1;
return;
}
else
{
cnt=0;
dfs2(u);
cycle.push(cnt);
}
vis[u]=1;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&s[i]);
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
dfs(i);
}
}
int sum=0;
long long ans=1;
while(!cycle.empty())
{
int tmp=cycle.front();
sum+=tmp;
ans=(ans*(pow(2,tmp,mod)-2))%mod;
cycle.pop();
}
int res=n-sum;//记录不在环中的节点个数
ans=(ans*pow(2,res,mod))%mod;
cout<<ans<<endl;
return 0;
}
codeforces711D Directed Rodes(dfs)
最新推荐文章于 2018-01-13 21:02:39 发布