Dang_Quan_10_Tin

SUNGRAPH

Jun 18th, 2022 (edited)
471
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #define task "SUNGRAPH"
  2. #include <iostream>
  3. #include <cstdio>
  4.  
  5. using namespace std;
  6.  
  7. using ll = long long;
  8. using ld = long double;
  9.  
  10. constexpr int N = 1e6 + 5;
  11. constexpr ll mod = 1e9 + 7;
  12. int n, p[N];
  13. ll f[N], ans(1), m;
  14. int status[N], dep[N];
  15.  
  16. void Read()
  17. {
  18.     cin >> n >> m;
  19.     for (int i = 1; i <= n; ++i)
  20.         cin >> p[i];
  21. }
  22.  
  23. ll Pow(ll a, ll b)
  24. {
  25.     ll ans = 1;
  26.     for (; b; b >>= 1)
  27.     {
  28.         if (b & 1)
  29.             ans = ans * a % mod;
  30.         a = a * a % mod;
  31.     }
  32.  
  33.     return ans;
  34. }
  35.  
  36. void Solve()
  37. {
  38.     f[1] = 0;
  39.     f[2] = 1ll * m * (m - 1) % mod;
  40.  
  41.     for (int i = 3; i <= n; ++i)
  42.     {
  43.         f[i] = (m * Pow(m - 1, i - 1) - f[i - 1]) % mod;
  44.         (f[i] += mod) %= mod;
  45.     }
  46.  
  47.     ans = 1;
  48.     int cnt = 0;
  49.  
  50.     for (int i = 1; i <= n; ++i)
  51.         if (!status[i])
  52.         {
  53.             int v = i;
  54.             status[i] = i;
  55.             dep[i] = 1;
  56.  
  57.             while (1)
  58.             {
  59.                 if (status[p[v]] == 0)
  60.                 {
  61.                     dep[p[v]] = dep[v] + 1;
  62.                     status[p[v]] = i;
  63.                     v = p[v];
  64.                 }
  65.                 else if (status[p[v]] == i)
  66.                 {
  67.                     ans = ans * f[dep[v] - dep[p[v]] + 1] % mod;
  68.                     cnt += dep[v] - dep[p[v]] + 1;
  69.            
  70.                     break;
  71.                 }
  72.                 else
  73.                     break;
  74.             }
  75.         }
  76.  
  77.     cout << ans * Pow(m - 1, n - cnt) % mod;
  78. }
  79.  
  80. int32_t main()
  81. {
  82.     ios_base::sync_with_stdio(0);
  83.     cin.tie(0);
  84.     cout.tie(0);
  85.  
  86.     if (fopen(task ".INP", "r"))
  87.     {
  88.         freopen(task ".INP", "r", stdin);
  89.         freopen(task ".OUT", "w", stdout);
  90.     }
  91.  
  92.     Read();
  93.     Solve();
  94. }
Add Comment
Please, Sign In to add comment