#include <bits/stdc++.h> #ifdef dbg #define D(...) fprintf(stderr, __VA_ARGS__) #define DD(...) D("[Debug] "#__VA_ARGS__ " = "), \ debug_helper::debug(__VA_ARGS__), D("\n") #include "C:\Users\wsyear\Desktop\OI\templates\debug.hpp" #else #define D(...) ((void)0) #define DD(...) ((void)0) #endif #define rep(i, j, k) for (int i = (j); i <= (k); ++i) #define per(i, j, k) for (int i = (j); i >= (k); --i) #define SZ(v) int((v).size()) #define ALL(v) (v).begin(),(v).end() #define fi first #define se second using ll = long long; using pii = std::pair<int, int>; using pll = std::pair<ll, ll>; template<class T> void chkmn(T &x, T y) { if (y < x) x = y; } template<class T> void chkmx(T &x, T y) { if (y > x) x = y; } using namespace std; template <int P> class mod_int { using Z = mod_int; private: static int mo(int x) { return x < 0 ? x + P : x; } public: int x; int val() const { return x; } mod_int() : x(0) {} template <class T> mod_int(const T &x_) : x(x_ >= 0 && x_ < P ? static_cast<int>(x_) : mo(static_cast<int>(x_ % P))) {} bool operator==(const Z &rhs) const { return x == rhs.x; } bool operator!=(const Z &rhs) const { return x != rhs.x; } Z operator-() const { return Z(x ? P - x : 0); } Z pow(long long k) const { Z res = 1, t = *this; while (k) { if (k & 1) res *= t; if (k >>= 1) t *= t; } return res; } Z &operator++() { x < P - 1 ? ++x : x = 0; return *this; } Z &operator--() { x ? --x : x = P - 1; return *this; } Z operator++(int) { Z ret = x; x < P - 1 ? ++x : x = 0; return ret; } Z operator--(int) { Z ret = x; x ? --x : x = P - 1; return ret; } Z inv() const { return pow(P - 2); } Z &operator+=(const Z &rhs) { (x += rhs.x) >= P && (x -= P); return *this; } Z &operator-=(const Z &rhs) { (x -= rhs.x) < 0 && (x += P); return *this; } Z &operator*=(const Z &rhs) { x = 1ULL * x * rhs.x % P; return *this; } Z &operator/=(const Z &rhs) { return *this *= rhs.inv(); } #define setO(T, o) \ friend T operator o(const Z &lhs, const Z &rhs) {\ Z res = lhs; \ return res o## = rhs; \ } setO(Z, +) setO(Z, -) setO(Z, *) setO(Z, /) #undef setO }; const int P = 1000000007; using Z = mod_int<P>; const int maxn = 15; int k, n; unordered_map<ll, int> mp; queue<vector<int>> q; vector<vector<int>> A; inline ll encode(vector<int> &x) { ll res = 0; for (auto a : x) res = res * n + a; return res; } inline vector<int> decode(ll x) { vector<int> res(n); per (i, n - 1, 0) res[i] = x % n, x /= n; return res; } int main() { cin.tie(nullptr) -> ios::sync_with_stdio(false); cin >> n >> k; rep (_, 1, k) { vector<int> a(n); for (int &x : a) cin >> x, x--; if (!mp.count(encode(a))) q.emplace(a), mp[encode(a)] = 1; A.emplace_back(a); } while (!q.empty()) { auto p = q.front(); q.pop(); for (auto q : A) { vector<int> a(n); rep (i, 0, n - 1) a[i] = p[q[i]]; if (!mp.count(encode(a))) mp[encode(a)] = 1, ::q.emplace(a); rep (i, 0, n - 1) a[i] = q[p[i]]; if (!mp.count(encode(a))) mp[encode(a)] = 1, ::q.emplace(a); } } Z ans = 0; for (auto [x, y] : mp) { auto a = decode(x); rep (i, 0, n - 1) rep (j, 0, i - 1) if (a[i] < a[j]) ans++; } cout << (ans / SZ(mp)).val() << '\n'; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | #include <bits/stdc++.h> #ifdef dbg #define D(...) fprintf(stderr, __VA_ARGS__) #define DD(...) D("[Debug] "#__VA_ARGS__ " = "), \ debug_helper::debug(__VA_ARGS__), D("\n") #include "C:\Users\wsyear\Desktop\OI\templates\debug.hpp" #else #define D(...) ((void)0) #define DD(...) ((void)0) #endif #define rep(i, j, k) for (int i = (j); i <= (k); ++i) #define per(i, j, k) for (int i = (j); i >= (k); --i) #define SZ(v) int((v).size()) #define ALL(v) (v).begin(),(v).end() #define fi first #define se second using ll = long long; using pii = std::pair<int, int>; using pll = std::pair<ll, ll>; template<class T> void chkmn(T &x, T y) { if (y < x) x = y; } template<class T> void chkmx(T &x, T y) { if (y > x) x = y; } using namespace std; template <int P> class mod_int { using Z = mod_int; private: static int mo(int x) { return x < 0 ? x + P : x; } public: int x; int val() const { return x; } mod_int() : x(0) {} template <class T> mod_int(const T &x_) : x(x_ >= 0 && x_ < P ? static_cast<int>(x_) : mo(static_cast<int>(x_ % P))) {} bool operator==(const Z &rhs) const { return x == rhs.x; } bool operator!=(const Z &rhs) const { return x != rhs.x; } Z operator-() const { return Z(x ? P - x : 0); } Z pow(long long k) const { Z res = 1, t = *this; while (k) { if (k & 1) res *= t; if (k >>= 1) t *= t; } return res; } Z &operator++() { x < P - 1 ? ++x : x = 0; return *this; } Z &operator--() { x ? --x : x = P - 1; return *this; } Z operator++(int) { Z ret = x; x < P - 1 ? ++x : x = 0; return ret; } Z operator--(int) { Z ret = x; x ? --x : x = P - 1; return ret; } Z inv() const { return pow(P - 2); } Z &operator+=(const Z &rhs) { (x += rhs.x) >= P && (x -= P); return *this; } Z &operator-=(const Z &rhs) { (x -= rhs.x) < 0 && (x += P); return *this; } Z &operator*=(const Z &rhs) { x = 1ULL * x * rhs.x % P; return *this; } Z &operator/=(const Z &rhs) { return *this *= rhs.inv(); } #define setO(T, o) \ friend T operator o(const Z &lhs, const Z &rhs) {\ Z res = lhs; \ return res o## = rhs; \ } setO(Z, +) setO(Z, -) setO(Z, *) setO(Z, /) #undef setO }; const int P = 1000000007; using Z = mod_int<P>; const int maxn = 15; int k, n; unordered_map<ll, int> mp; queue<vector<int>> q; vector<vector<int>> A; inline ll encode(vector<int> &x) { ll res = 0; for (auto a : x) res = res * n + a; return res; } inline vector<int> decode(ll x) { vector<int> res(n); per (i, n - 1, 0) res[i] = x % n, x /= n; return res; } int main() { cin.tie(nullptr) -> ios::sync_with_stdio(false); cin >> n >> k; rep (_, 1, k) { vector<int> a(n); for (int &x : a) cin >> x, x--; if (!mp.count(encode(a))) q.emplace(a), mp[encode(a)] = 1; A.emplace_back(a); } while (!q.empty()) { auto p = q.front(); q.pop(); for (auto q : A) { vector<int> a(n); rep (i, 0, n - 1) a[i] = p[q[i]]; if (!mp.count(encode(a))) mp[encode(a)] = 1, ::q.emplace(a); rep (i, 0, n - 1) a[i] = q[p[i]]; if (!mp.count(encode(a))) mp[encode(a)] = 1, ::q.emplace(a); } } Z ans = 0; for (auto [x, y] : mp) { auto a = decode(x); rep (i, 0, n - 1) rep (j, 0, i - 1) if (a[i] < a[j]) ans++; } cout << (ans / SZ(mp)).val() << '\n'; } |