#include<bits/stdc++.h> using namespace std; vector<int>aplikuj(vector<int>f, vector<int>g){ vector<int>wynik(f.size(), 0); for(int i=0;i<(int)f.size();i++) wynik[i] = g[f[i]]; return wynik; } map<vector<int>, int>legenda; vector<vector<int>>dostepne; vector<vector<int>>graf; bool odw[5000010]; void dfs(int x){ odw[x] = 1; for(auto j: dostepne){ auto pom = aplikuj(j, graf[x]); if(!odw[legenda[pom]]) dfs(legenda[pom]); } } int ile[12][12]; const long long mod = 1000000007; long long qp(long long a, long long b){ if(b==0)return 1; if(b%2)return qp(a, b-1)*a%mod; long long c = qp(a, b/2); return c*c%mod; } int odw1[5000010]; int inv(vector<int>pom){ int res = 0; for(int i=0;i<(int)pom.size();i++) for(int j = i+1;j<(int)pom.size();j++) if(pom[i]>pom[j]) res++; return res; } int main() { int n, i; scanf("%d", &n); vector<int>pom; for(i=0;i<n;i++) pom.push_back(i); do{ legenda[pom] = (int)graf.size(); graf.push_back(pom); }while(next_permutation(pom.begin(), pom.end())); int k, K; scanf("%d", &k);K = k; vector<int>inversions; while(k--){ vector<int>perm; for(i=0;i<n;i++){ perm.push_back(0); scanf("%d", &perm.back()); perm.back()--; } inversions.push_back(inv(perm)); dostepne.push_back(perm); } dfs(0); // return 0; int zlicz = 0; int suma = 0; for(auto j:legenda){ if(odw[j.second]){ zlicz++; for(i=0;i<n;i++) for(int ij=i+1;ij<n;ij++) if(j.first[i]>j.first[ij]) ile[i][ij]++; // for(auto ij: j.first) // printf("%d ", ij);printf("\n"); } } for(i=0;i<n;i++){ for(int j=i+1;j<n;j++){ // printf("%d ", ile[i][j]); suma+=ile[i][j]; } // printf("\n"); } printf("%lld\n", qp(zlicz, mod-2)*suma%mod); //printf(" = %lld / %lld\n", suma, zlicz); return 0; sort(inversions.begin(), inversions.end()); /* if((int)inversions.size()==3 && inversions[0]==1 && inversions[1]==2 && inversions[2]==2) { printf("n:%d inv:", n); for(auto j: inversions)printf("%d ", j);printf(":\n"); printf("%lld\n", qp(zlicz, mod-2)*suma%mod); // printf(" = %lld / %lld\n", suma, zlicz); }*/ }
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 | #include<bits/stdc++.h> using namespace std; vector<int>aplikuj(vector<int>f, vector<int>g){ vector<int>wynik(f.size(), 0); for(int i=0;i<(int)f.size();i++) wynik[i] = g[f[i]]; return wynik; } map<vector<int>, int>legenda; vector<vector<int>>dostepne; vector<vector<int>>graf; bool odw[5000010]; void dfs(int x){ odw[x] = 1; for(auto j: dostepne){ auto pom = aplikuj(j, graf[x]); if(!odw[legenda[pom]]) dfs(legenda[pom]); } } int ile[12][12]; const long long mod = 1000000007; long long qp(long long a, long long b){ if(b==0)return 1; if(b%2)return qp(a, b-1)*a%mod; long long c = qp(a, b/2); return c*c%mod; } int odw1[5000010]; int inv(vector<int>pom){ int res = 0; for(int i=0;i<(int)pom.size();i++) for(int j = i+1;j<(int)pom.size();j++) if(pom[i]>pom[j]) res++; return res; } int main() { int n, i; scanf("%d", &n); vector<int>pom; for(i=0;i<n;i++) pom.push_back(i); do{ legenda[pom] = (int)graf.size(); graf.push_back(pom); }while(next_permutation(pom.begin(), pom.end())); int k, K; scanf("%d", &k);K = k; vector<int>inversions; while(k--){ vector<int>perm; for(i=0;i<n;i++){ perm.push_back(0); scanf("%d", &perm.back()); perm.back()--; } inversions.push_back(inv(perm)); dostepne.push_back(perm); } dfs(0); // return 0; int zlicz = 0; int suma = 0; for(auto j:legenda){ if(odw[j.second]){ zlicz++; for(i=0;i<n;i++) for(int ij=i+1;ij<n;ij++) if(j.first[i]>j.first[ij]) ile[i][ij]++; // for(auto ij: j.first) // printf("%d ", ij);printf("\n"); } } for(i=0;i<n;i++){ for(int j=i+1;j<n;j++){ // printf("%d ", ile[i][j]); suma+=ile[i][j]; } // printf("\n"); } printf("%lld\n", qp(zlicz, mod-2)*suma%mod); //printf(" = %lld / %lld\n", suma, zlicz); return 0; sort(inversions.begin(), inversions.end()); /* if((int)inversions.size()==3 && inversions[0]==1 && inversions[1]==2 && inversions[2]==2) { printf("n:%d inv:", n); for(auto j: inversions)printf("%d ", j);printf(":\n"); printf("%lld\n", qp(zlicz, mod-2)*suma%mod); // printf(" = %lld / %lld\n", suma, zlicz); }*/ } |