Advertisement
zipdang04

F

Dec 3rd, 2021
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.07 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. /*
  4. #include <ext/pb_ds/assoc_container.hpp>
  5. #include <ext/pb_ds/tree_policy.hpp>
  6. using namespace __gnu_pbds;
  7. typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
  8. */
  9.  
  10. typedef long long ll;
  11. typedef long double ld;
  12. typedef vector<int> vi;
  13. typedef vector<ll> vl;
  14. typedef pair<int, int> pii;
  15. typedef pair<ll, ll> pll;
  16. typedef map<int, int> mii;
  17. typedef unordered_map<int, int> umii;
  18. typedef map<ll, ll> mll;
  19. typedef unordered_map<ll, ll> umll;
  20. template <class T1, class T2>
  21. void maximize(T1 &a, T2 b){
  22. if (b > a) a = b;
  23. }
  24. template <class T1, class T2>
  25. void minimize(T1 &a, T2 b){
  26. if (b < a) a = b;
  27. }
  28. template <class T>
  29. void read(T &number)
  30. {
  31. bool negative = false;
  32. register int c;
  33. number = 0;
  34. c = getchar();
  35. while (c != '-' && !isalnum(c)) c = getchar();
  36. if (c=='-'){
  37. negative = true;
  38. c = getchar();
  39. }
  40. for (; (c>47 && c<58); c=getchar())
  41. number = number *10 + c - 48;
  42. if (negative)
  43. number *= -1;
  44. }
  45. template <class T, class ...Ts>
  46. void read(T &a, Ts& ... args){
  47. read(a);
  48. read(args...);
  49. }
  50.  
  51. /*
  52. struct Node
  53. {
  54. int node, len;
  55. Node() {node = len = 0;}
  56. Node(int node, int len) {this -> node = node, this -> len = len;}
  57. };
  58. typedef vector<Node> vg;
  59. */
  60.  
  61. #define MAX 1000001
  62. #define MOD 998244353
  63.  
  64. #define fi first
  65. #define se second
  66. #define pf push_front
  67. #define pb push_back
  68.  
  69. #define FOR(type, i, a, b) for(type i = (a); i <= (b); i++)
  70. #define FORD(type, i, b, a) for(type i = (b); i >= (a); i--)
  71.  
  72. #define testBit(n, bit) ((n >> bit) & 1)
  73. #define flipBit(n, bit) (n ^ (1ll << bit))
  74. #define cntBit(n) __builtin_popcount(n)
  75. #define cntBitll(n) __builtin_popcountll(n)
  76. #define randomize mt19937_64 mt(chrono::steady_clock::now().time_since_epoch().count());
  77.  
  78. struct Matrix{
  79. int mat[2][2];
  80. void clear(){
  81. memset(mat, false, sizeof(mat));
  82. }
  83. Matrix(){
  84. clear();
  85. }
  86. void unit(){
  87. mat[0][0] = mat[1][1] = 1;
  88. }
  89. int* operator [](int idx){return mat[idx];}
  90. };
  91. Matrix operator * (Matrix a, Matrix b){
  92. Matrix ans;
  93. FOR(int, k, 0, 1) FOR(int, i, 0, 1) FOR(int, j, 0, 1)
  94. ans[i][j] += 1ll * a[i][k] * b[k][j] % MOD,
  95. ans[i][j] %= MOD;
  96. return ans;
  97. }
  98.  
  99. int theta, n, k;
  100. int f[MAX];
  101.  
  102. const int BIT = 19;
  103. Matrix mul[BIT + 1];
  104. void init(){
  105. Matrix base;
  106. base[0][0] = 0, base[0][1] = k - 1, base[1][0] = 1, base[1][1] = k - 2;
  107. mul[0] = base;
  108. FOR(int, i, 1, BIT) mul[i] = mul[i - 1] * mul[i - 1];
  109. }
  110.  
  111. int visited[MAX];
  112. bool inLoop[MAX];
  113. int root;
  114. int dfs(int node, int x){
  115. // cerr << "dfs: " << node << ' ' << x << '\n';
  116. visited[node] = x;
  117. int jmp = f[node];
  118.  
  119. if (visited[jmp]){
  120. if (visited[jmp] != x) return 0;
  121. inLoop[node] = true;
  122. if (jmp == node) return 1;
  123. root = jmp; return 1;
  124. }
  125.  
  126. int answer = dfs(jmp, x);
  127. if (root){
  128. answer++; inLoop[node] = true;
  129. if (root == node) root = 0;
  130. }
  131. return answer;
  132. }
  133.  
  134. int cal(int loopLen){
  135. if (loopLen == 1) return 1;
  136. Matrix ans; ans[0][0] = 1, ans[0][1] = 0;
  137. loopLen -= 1;
  138. for (int bit = 0; loopLen; bit++){
  139. if (loopLen & 1)
  140. ans = ans * mul[bit];
  141. loopLen >>= 1;
  142. }
  143.  
  144. return ans[0][1];
  145. }
  146.  
  147. main()
  148. {
  149. ios_base::sync_with_stdio(0); cin.tie(0);
  150. #ifndef HIEU
  151. freopen("paleta.inp", "r", stdin);
  152. freopen("paleta.out", "w", stdout);
  153. #endif
  154. cin >> theta >> n >> k; init();
  155. FOR(int, i, 1, n) cin >> f[i];
  156.  
  157. ll answer = 1, ptr = 1;
  158. FOR(int, i, 1, n)
  159. if (not visited[i]){
  160. // cerr << i << '\n';
  161. int loopSize = dfs(i, ptr++);
  162. if (loopSize == 0) continue;
  163. // cerr << loopSize << "out\n";
  164. // cerr << "root:" << root << '\n';
  165. answer *= 1ll * cal(loopSize) * k % MOD, answer %= MOD;
  166. }
  167. FOR(int, i, 1, n) if (not inLoop[i]) answer *= k - 1, answer %= MOD;
  168. cout << answer << '\n';
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement