#include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; int n, k; const int MAX_S = 9000005; int w(int a, int b){ return (a-1)*n+(b-1); } PII decod(int a){ return {a/n+1, a%n+1}; } int p[3005][3005]; // vector<int> G[MAX_S]; int num[3005][3005]; long long inv[2]; void dfs(int v, int u, int & ti){ num[v][u] = ti; if(v < u) inv[0]++; else inv[1]++; for(int i=0;i<k;i++){ int a = p[i][v], b = p[i][u]; if(num[a][b] == 0){ dfs(a, b, ti); } } } const int mod = 1e9+7; long long pot(long long a, long long x){ if(x == 0) return 1; if(x&1) return pot(a, x-1)*a%mod; long long tmp = pot(a, x/2); return tmp*tmp%mod; } int main(){ ios_base::sync_with_stdio(0); cin>>n>>k; for(int i=0;i<k;i++){ for(int j=1;j<=n;j++){ cin>>p[i][j]; } } // for(int t=0;t<k;t++){ // for(int i=1;i<=n;i++){ // for(int j=1;j<=n;j++){ // G[w(i,j)].push_back(w(p[t][i], p[t][j])); // } // } // } int ti = 1; long long res = 0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ if(num[i][j] != 0) continue; inv[0] = 0, inv[1] = 0; dfs(i, j, ti); ti++; long long tmp = inv[0]*inv[1]%mod; tmp = tmp*pot(inv[0]+inv[1], mod-2)%mod; res = (res+tmp)%mod; } cout<<res<<endl; }
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 | #include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; int n, k; const int MAX_S = 9000005; int w(int a, int b){ return (a-1)*n+(b-1); } PII decod(int a){ return {a/n+1, a%n+1}; } int p[3005][3005]; // vector<int> G[MAX_S]; int num[3005][3005]; long long inv[2]; void dfs(int v, int u, int & ti){ num[v][u] = ti; if(v < u) inv[0]++; else inv[1]++; for(int i=0;i<k;i++){ int a = p[i][v], b = p[i][u]; if(num[a][b] == 0){ dfs(a, b, ti); } } } const int mod = 1e9+7; long long pot(long long a, long long x){ if(x == 0) return 1; if(x&1) return pot(a, x-1)*a%mod; long long tmp = pot(a, x/2); return tmp*tmp%mod; } int main(){ ios_base::sync_with_stdio(0); cin>>n>>k; for(int i=0;i<k;i++){ for(int j=1;j<=n;j++){ cin>>p[i][j]; } } // for(int t=0;t<k;t++){ // for(int i=1;i<=n;i++){ // for(int j=1;j<=n;j++){ // G[w(i,j)].push_back(w(p[t][i], p[t][j])); // } // } // } int ti = 1; long long res = 0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ if(num[i][j] != 0) continue; inv[0] = 0, inv[1] = 0; dfs(i, j, ti); ti++; long long tmp = inv[0]*inv[1]%mod; tmp = tmp*pot(inv[0]+inv[1], mod-2)%mod; res = (res+tmp)%mod; } cout<<res<<endl; } |