#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; } |
English