rohitranjan017

369D

Aug 30th, 2016
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include<bits/stdc++.h>
  2. #define up(j,k,i) for(i=j;i<k;i++)
  3. #define down(j,k,i) for(i=j;i>k;i--)
  4. #define M 1000000007
  5. typedef long long int ll;
  6. using namespace std;
  7. ll i,j,k,z,t,n,m,sum,ans,x,y,maxm=0,minm=inf;
  8. map<ll,ll> child;
  9. vector par[200005];
  10. bool vis[200005],revis[200005],permvis[200005];
  11. stack s;
  12. ll pow2[400005];
  13.  
  14. void dfs(ll x)
  15. {
  16.     if(vis[x]) return;
  17.     vis[x]=1;
  18.  
  19. dfs(child[x]);
  20. s.push(x);
  21. }
  22.  
  23. void rev_dfs(ll x,ll cnt)
  24. {
  25. permvis[x]=1;
  26. revis[x]=1;
  27.  
  28.     for(auto c:par[x])
  29.     {
  30.         if(revis[c]!=1)
  31.         rev_dfs(c,cnt+1);
  32.  
  33.         else
  34.         if(revis[c])
  35.         z=1,ans=cnt+1;
  36.     }
  37.  
  38. revis[x]=0;
  39. }
  40. int main()
  41. {
  42. fact[0]=1;
  43. sum=1;
  44.  
  45. cin>>n;
  46.  
  47.     up(1,n+1,i)
  48.     fact[i]=fact[i-1]*2%M;
  49.  
  50.     up(1,n+1,i)
  51.     { cin>>x; child[i]=x; par[x].pb(i); }
  52.  
  53.     up(1,n+1,i)
  54.     {
  55.     if(!vis[i])
  56.     dfs(i);
  57.     }
  58.  
  59. while(!s.empty())
  60. {
  61.  ans=0; z=0;
  62.  
  63. x=s.top();
  64. s.pop();
  65.  
  66. if(permvis[x])
  67. continue;
  68.  
  69. rev_dfs(x,0);
  70.  
  71. if(z)
  72. sum=sum*(fact[ans]-2)%M,y+=ans;
  73.  
  74. }
  75.  
  76. sum=sum*(fact[n-y])%M;
  77.  
  78. cout<<(sum+M)%M;
  79.  
  80. }
Add Comment
Please, Sign In to add comment