Dmaxiya

T708004 G. 哈希表之线性探测 [Hello World 2026 蓝桥杯选拔赛]

Dec 21st, 2025
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.44 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long LL;
  5. const int maxn = 200000 + 100;
  6. const LL MOD = 998244353;
  7. int n;
  8. int num[maxn], son[maxn], fa[maxn], rt[maxn], deg[maxn];
  9. bool vis[maxn];
  10. LL dp[maxn], inv[maxn], pro[maxn], invpro[maxn];
  11. vector<int> G[maxn];
  12. queue<int> que;
  13.  
  14. void init() {
  15.     inv[1] = 1;
  16.     for(int i = 2; i < maxn; ++i) {
  17.         inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
  18.     }
  19.     pro[0] = invpro[0] = 1;
  20.     for(int i = 1; i < maxn; ++i) {
  21.         pro[i] = pro[i - 1] * i % MOD;
  22.         invpro[i] = invpro[i - 1] * inv[i] % MOD;
  23.     }
  24.     for (int i = 0; i < n; ++i) {
  25.         fa[i] = i;
  26.         rt[i] = i;
  27.         vis[i] = false;
  28.     }
  29. }
  30.  
  31. LL C(int n, int m) {
  32.     if(n < m) {
  33.         return 0;
  34.     }
  35.     return pro[n] * invpro[m] % MOD * invpro[n - m] % MOD;
  36. }
  37.  
  38. int Find(int *fa, int x) {
  39.     return x == fa[x] ? x : fa[x] = Find(fa, fa[x]);
  40. }
  41.  
  42. void unit(int *fa, int x, int y) {
  43.     fa[Find(fa, x)] = Find(fa, y);
  44. }
  45.  
  46. void dfs(int root, int fa) {
  47.     dp[root] = 1;
  48.     for (int pos : G[root]) {
  49.         if (pos == fa) {
  50.             continue;
  51.         }
  52.         dfs(pos, root);
  53.         dp[root] = dp[root] * C(son[root] + son[pos], son[pos]) % MOD * dp[pos] % MOD;
  54.         son[root] += son[pos];
  55.     }
  56.     ++son[root];
  57. }
  58.  
  59. int main() {
  60. #ifdef ExRoc
  61.     freopen("test.txt", "r", stdin);
  62. #endif // ExRoc
  63.     ios::sync_with_stdio(false);
  64.  
  65.     cin >> n;
  66.     assert(1 <= n && n <= 100000);
  67.     init();
  68.     for (int i = 0; i < n; ++i) {
  69.         cin >> num[i];
  70.         assert(-1 <= num[i] && num[i] <= 1000000000);
  71.         if (num[i] != -1 && num[i] % n == i) {
  72.             que.push(i);
  73.             vis[i] = true;
  74.         }
  75.     }
  76.     while (!que.empty()) {
  77.         int tmp = que.front();
  78.         que.pop();
  79.         unit(fa, tmp, (tmp + 1) % n);
  80.         int idx = Find(fa, tmp);
  81.         if (vis[idx] || num[idx] == -1) {
  82.             continue;
  83.         }
  84.         if (Find(fa, num[idx] % n) != idx) {
  85.             continue;
  86.         }
  87.         vis[idx] = true;
  88.         que.push(idx);
  89.         int s = num[idx] % n;
  90.         while ((s = Find(rt, s)) != idx) {
  91.             G[idx].push_back(s);
  92.             unit(rt, s, idx);
  93.             ++deg[s];
  94.             s = (s + 1) % n;
  95.         }
  96.     }
  97.     for (int i = 0; i < n; ++i) {
  98.         if (num[i] != -1 && deg[i] == 0) {
  99.             G[n].push_back(i);
  100.         }
  101.     }
  102.     dfs(n, n);
  103.     cout << dp[n] << endl;
  104.  
  105.     return 0;
  106. }
Add Comment
Please, Sign In to add comment