https://blog.csdn.net/nka_kun/article/details/81902421
#include<bits/stdc++.h> #define ll long long #define pb push_back using namespace std; const ll mod=1000000007; const int maxn=100010; int n,k,T,cnt; ll f[maxn]; vector<int>v[6][1010]; struct node{ int p[6]; // bool operator <(const node&x)const{ // for(int i=1;i<=k;i++) // if(p[i]<=x.p[i])return 0; // return 1; // } friend bool operator <(node x,node y){ for(int i=1;i<=k;i++) if(x.p[i]>=y.p[i])return 0; return 1; } }a[maxn],b; void dfs(int x,int p){ if(x==k+1)a[++cnt]=b; else{ int s=v[x][p].size(); for(int i=0;i<s;i++){ b.p[x]=v[x][p][i]; dfs(x+1,p); } } } bool cmp(node a,node b){ for(int i=1;i<=k;i++) if(a.p[i]!=b.p[i])return a.p[i]<b.p[i]; return 0; } int main(){ scanf("%d",&T); while(T--){ scanf("%d%d",&k,&n); for(int i=1;i<=k;i++) for(int j=1;j<=n;j++)v[i][j].clear(); cnt=0; for(int i=1;i<=k;i++) for(int j=1,x;j<=n;j++)scanf("%d",&x),v[i][x].pb(j);//每個數出現位置 for(int i=1;i<=n;i++) dfs(1,i); sort(a+1,a+cnt+1,cmp); for(int i=1;i<=cnt;i++)f[i]=1; for(int i=1;i<=cnt;i++) for(int j=1;j<i;j++) if(a[j]<a[i]) (f[i]+=f[j])%=mod; ll ans=0; for(int i=1;i<=cnt;i++) (ans+=f[i])%=mod; printf("%lld ",ans); } }