Advertisement
Guest User

sims_sifting

a guest
Sep 9th, 2023
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int Maxn = 55, Maxm = 105;
  5. int n, m;
  6. struct perm {
  7.     int p[Maxn];
  8.     perm() {
  9.         for (int i = 0; i < n; i++) p[i] = i;
  10.     }
  11.     perm(const perm &u) {
  12.         for (int i = 0; i < n; i++) p[i] = u.p[i];
  13.     }
  14.     perm inv(void) {
  15.         perm res;
  16.         for (int i = 0; i < n; i++)
  17.             res.p[p[i]] = i;
  18.         return res;
  19.     }
  20. } P[Maxm], *B[Maxn][Maxn];
  21. perm mul(perm a, perm b, int i) {
  22.     perm res;
  23.     for (; i < n; i++)
  24.         res.p[i] = a.p[b.p[i]];
  25.     return res;
  26. }
  27. bool vis[Maxn][Maxn];
  28. queue <pair <int, int> > Qu;
  29. void sifting(perm sigma) {
  30.     for (int i = 0; i < n; i++) {
  31.         if (B[i][sigma.p[i]] == NULL)
  32.             return B[i][sigma.p[i]] = new perm(sigma), Qu.push(make_pair(i, sigma.p[i]));
  33.         if (sigma.p[i] != i) sigma = mul(B[i][sigma.p[i]] -> inv(), sigma, i);
  34.     }
  35. }
  36. const unsigned long long lim = 1e18;
  37. struct output {
  38.     unsigned long long val[4];
  39.     output() {
  40.         val[0] = val[1] = val[2] = 0, val[3] = 1;
  41.     }
  42.     output operator * (int x) {
  43.         output res = *this;
  44.         for (int i = 0; i <= 3; i++) {
  45.             __int128 tmp = (__int128) res.val[i] * x;
  46.             res.val[i - 1] += tmp / lim, res.val[i] = (long long) (tmp % lim);
  47.         }
  48.         for (int i = 3; i >= 0; i--)
  49.             if (res.val[i] >= lim) res.val[i] -= lim, res.val[i - 1]++;
  50.         return res;
  51.     }
  52.     void print(void) {
  53.         bool flag = false;
  54.         for (int i = 0; i <= 3; i++) {
  55.             if (flag) printf("%018llu", val[i]);
  56.             else if (val[i])
  57.                 printf("%llu", val[i]), flag = true;
  58.         }
  59.     }
  60. } ans;
  61. int main() {
  62.     scanf("%d%d", &n, &m);
  63.     for (int i = 0; i < m; i++)
  64.         for (int j = 0; j < n; j++)
  65.             scanf("%d", &P[i].p[j]), P[i].p[j]--;
  66.     B[0][0] = new perm();
  67.     for (int i = 1; i < n; i++)
  68.         B[i][i] = B[0][0];
  69.     for (int i = 0; i < m; i++)
  70.         sifting(P[i]);
  71.     while (!Qu.empty()) {
  72.         int x = Qu.front().first, y = Qu.front().second;
  73.         Qu.pop();
  74.         for (int i = 0; i < n; i++)
  75.             for (int j = i + 1; j < n; j++)
  76.                 if (B[i][j] != NULL) sifting(mul(*B[i][j], *B[x][y], 0));
  77.     }
  78.     for (int i = 0; i < n; i++) {
  79.         int cnt = 0;
  80.         for (int j = i; j < n; j++)
  81.             if (B[i][j] != NULL) cnt++;
  82.         ans = ans * cnt;
  83.     }
  84.     return ans.print(), 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement