abdukodir

PALETA

Nov 21st, 2013
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1. #include<cstdio>
  2. #include<stack>
  3. #include<vector>
  4.  
  5. #define sc scanf
  6. #define pr printf
  7. #define fr first
  8. #define se second
  9. #define pb push_back
  10. #define mp make_pair
  11. using namespace std;
  12. const int MN = 1000002;
  13. const long long INF = 1000000007LL;
  14.  
  15. int n, k, f[MN], parent[MN], comp, ncomp[MN], ccomp[MN], pcomp[MN];
  16. long long d[MN], power[MN], dtmp;
  17. vector<int>g[MN];
  18. bool u[MN];
  19. stack< pair<int, int> >st;
  20. pair<int, int>pa;
  21. void dfs(int x, int p){
  22. int i;
  23. //pr("%d %d\n", x, p);
  24. st.push( mp(x, p) );
  25. while(!st.empty()){
  26. pa = st.top();
  27. st.pop();
  28. x = pa.fr;
  29. p = pa.se;
  30. //pr("%d\n", x);
  31. if(u[x]){
  32. if(ccomp[comp] == 0){
  33. ccomp[comp] = p;
  34. pcomp[comp] = x;
  35. }
  36. }
  37. else {
  38. u[x] = true;
  39. ncomp[comp]++;
  40. parent[x] = p;
  41. for(i=0; i<g[x].size(); i++){
  42. if(g[x][i] != parent[x]){
  43. st.push( mp(g[x][i], x) );
  44. }
  45. }
  46. }
  47. }
  48. }
  49. int main(){
  50. freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
  51. sc("%d%d", &n, &k);
  52. int i, j, nc;
  53. d[3] = ( 1LL*k*(k-1)*(k-2) )%INF;
  54. dtmp = ( 1LL*k*(k-1) )%INF;
  55. for(i=4; i<=n; i++){
  56. d[i] = ( d[i-1]*(k-2) + dtmp*(k-1) )%INF;
  57. dtmp = d[i-1];
  58. }
  59. power[0] = 1;
  60. for(i=1; i<=n; i++){
  61. power[i] = ( power[i-1]*(k-1) )%INF;
  62. }
  63.  
  64. for(i=1; i<=n; i++){
  65. sc("%d", &f[i]);
  66. if(f[i] != i && f[ f[i] ] != i){
  67. g[i].pb( f[i] );
  68. g[ f[i] ].pb(i);
  69. }
  70. }
  71. for(i=1; i<=n; i++){
  72. if(!u[i]){
  73. dfs(i, -1);
  74. comp++;
  75. }
  76. }
  77. long long ans = 1LL;
  78. for(i=0; i<comp; i++){
  79. if(ccomp[i] == 0){
  80. ans = ((( ans*power[ ncomp[i]-1 ] )%INF)*k)%INF;
  81. }
  82. else{
  83. nc = 0;
  84. for(j=ccomp[i]; j != parent[ pcomp[i] ]; j = parent[j]){
  85. //pr("ccomp -> %d\n", j);
  86. nc++;
  87. }
  88. //pr("%d\n", nc);
  89. ans = ((( ans*d[nc] )%INF)*power[ ncomp[i]-nc ])%INF;
  90. }
  91. }
  92. pr("%lld\n", ans);
  93. return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment