Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define up(j,k,i) for(i=j;i<k;i++)
- #define down(j,k,i) for(i=j;i>k;i--)
- #define M 1000000007
- typedef long long int ll;
- using namespace std;
- ll i,j,k,z,t,n,m,sum,ans,x,y,maxm=0,minm=inf;
- map<ll,ll> child;
- vector par[200005];
- bool vis[200005],revis[200005],permvis[200005];
- stack s;
- ll pow2[400005];
- void dfs(ll x)
- {
- if(vis[x]) return;
- vis[x]=1;
- dfs(child[x]);
- s.push(x);
- }
- void rev_dfs(ll x,ll cnt)
- {
- permvis[x]=1;
- revis[x]=1;
- for(auto c:par[x])
- {
- if(revis[c]!=1)
- rev_dfs(c,cnt+1);
- else
- if(revis[c])
- z=1,ans=cnt+1;
- }
- revis[x]=0;
- }
- int main()
- {
- fact[0]=1;
- sum=1;
- cin>>n;
- up(1,n+1,i)
- fact[i]=fact[i-1]*2%M;
- up(1,n+1,i)
- { cin>>x; child[i]=x; par[x].pb(i); }
- up(1,n+1,i)
- {
- if(!vis[i])
- dfs(i);
- }
- while(!s.empty())
- {
- ans=0; z=0;
- x=s.top();
- s.pop();
- if(permvis[x])
- continue;
- rev_dfs(x,0);
- if(z)
- sum=sum*(fact[ans]-2)%M,y+=ans;
- }
- sum=sum*(fact[n-y])%M;
- cout<<(sum+M)%M;
- }
Add Comment
Please, Sign In to add comment