题目链接:http://codeforces.com/problemset/problem/711/D
思路:由于每个点出度都为1,所以没有复杂的环中带环。DFS遍历,若为环则有2^k-2种,若为链则为2^k种。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10; const int mod=1e9+7; int v[N],vis[N],num,times[N],c[N]; ll ans=1; ll quickpow(ll a,ll b) { ll res=1; while(b) { if(b&1) res*=a; res%=mod; a*=a; a%=mod; b>>=1; } return res; } void dfs(ll i,ll x) { if(times[i]) { if(times[i]==num)//如果属于本次遍历,则有环存在 { ans*=quickpow(2,x-c[i])-2;//环部分 ans%=mod; ans*=quickpow(2,c[i]);//链部分 ans%=mod; return; } ans*=quickpow(2,x);//未找到环,只有链 ans%=mod; return; } times[i]=num; c[i]=x; dfs(v[i],x+1); } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",v+i); for(int i=1;i<=n;i++) { if(!times[i]) num++,dfs(i,0); } printf("%I64d ",ans); return 0; }