提交时间:2026-03-05 18:22:42

运行 ID: 40455

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define pb push_back #define eb emplace_back #define ppc __builtin_popcount using namespace std; typedef long long ll; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } const int p=1e9+7; int f[64][33][2],a[64],id[64],cnt[64],siz[64],s,L,n,m; void dfs(int l,int r,int p,int d){ if(l==r){ if(cnt[a[l]]>=2){ siz[p]=0;up(i,0,1)f[p][0][i]=0; f[p][0][(s>>id[a[l]])&1]=1; }else{ siz[p]=1;up(i,0,1)up(j,0,1)f[p][i][j]=0; f[p][0][0]=1,f[p][1][1]=1; } return; } int mid=l+r>>1; dfs(l,mid,p<<1,!d),dfs(mid+1,r,p<<1|1,!d); siz[p]=siz[p<<1]+siz[p<<1|1]; up(i,0,siz[p])f[p][i][0]=f[p][i][1]=0; up(i,0,siz[p<<1])up(x,0,1)up(j,0,siz[p<<1|1])up(y,0,1) f[p][i+j][(d?(x|y):(x&y))]=(f[p][i+j][(d?(x|y):(x&y))]+f[p<<1][i][x]*1llu*f[p<<1|1][j][y])%(::p); } int all[33],val[105]; inline int qp(int a,int b){ int res=1; for(;b;b>>=1,a=a*1llu*a%p)if(b&1)res=res*1llu*a%p; return res; } const int D=100; void slv(){ n=read(),m=read(),L=read();up(i,1,n)cnt[i]=0; up(i,0,(1<<L)-1)a[i]=read(),++cnt[a[i]]; int prd=1; int c=0;up(i,1,n)if(cnt[i]>=2)id[i]=c++;else if(!cnt[i])prd=prd*1llu*m%p; up(i,0,n)all[i]=0; for(s=0;s<(1<<c);s++){ dfs(0,(1<<L)-1,1,1); up(i,0,siz[1])all[i+ppc(s)]=(all[i+ppc(s)]+f[1][i][1])%p; } int tot=0; up(i,1,n)if(cnt[i])tot++; int res=0; up(i,0,tot){ auto F=[&](int m){ int res=0; up(j,1,m)res=(res+qp(m-j+1,i)*1llu*qp(j-1,tot-i))%p; return res; }; up(j,1,D)val[j]=F(j); int sum=0; up(j,1,D){ int s1=1,s2=1; up(k,1,D)if(k!=j)s1=s1*1llu*(m-k+p)%p,s2=s2*1llu*(j-k+p)%p; s1=s1*1llu*qp(s2,p-2)%p; sum=(sum+s1*1llu*val[j])%p; } res=(res+sum*1llu*all[i])%p; } res=res*1llu*prd%p; printf("%d\n",res); } int main(){ // freopen("game.in","r",stdin),freopen("game.out","w",stdout); int t=read();while(t--)slv(); return 0; }