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
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <ctime>
#include <cmath>
#include <chrono>
#include <map>
#include <assert.h>
#include <fstream>
#include <cstdlib>
#include <random>
#include <iomanip>
#include <queue>
#include <random>
#include <unordered_map>
 
using namespace std;

#define sqr(a) ((a)*(a))
#define all(a) (a).begin(), (a).end()

const int MOD = (int) 1e9 + 7;

long long binPow(long long a, long long b) {
    if (b == 0) {
        return 1;
    }

    long long ans = binPow(a, b / 2);
    ans = ans * ans % MOD;

    if (b % 2) {
        ans = ans * a % MOD;
    }

    return ans;
}

void solve() {
    int n, m;
    cin >> n >> m;

    set<vector<int> > a;
    for (int i = 0; i < m; ++i) {
        vector<int> b(n);

        for (int j = 0; j < n; ++j) {
            cin >> b[j];
            --b[j];
        }

        a.insert(b);
    }

    while (true) {
        vector<vector<int> > w;
        for (auto i : a) {
            w.push_back(i);
        }

        int temp = a.size();

        for (int i = 0; i < w.size(); ++i) {
            for (int j = 0; j < w.size(); ++j) {
                vector<int> c(n);
                for (int k = 0; k < n; ++k) {
                    c[k] = w[i][w[j][k]];
                }

                a.insert(c);
            }
        }

        if (a.size() == temp) {
            break;
        }
    }

    long long globalAns = 0;
    for (auto i : a) {
        int ans = 0;
        for (int j = 0; j < n; ++j) {
            for (int k = j + 1; k < n; ++k) {
                if (i[k] < i[j]) {
                    ++ans;
                }
            }
        }

        (globalAns += ans * binPow(a.size(), MOD - 2) % MOD) %= MOD;

        // cout << ans << "\n";
    }

    cout << globalAns << "\n";
}

int main() {
    // freopen("input.txt", "r", stdin);
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int tests = 1;
    // cin >> tests;

    for (int i = 0; i < tests; ++i) {
        solve();
    }
}