#include #include #include using namespace atcoder; using mint = modint1000000007; using namespace std; #define rep(i,n) for(int i=0;i<(n);i++) #define Inf 1000000001 template struct matrix{ vector> v; int _h,_w; matrix(vector> X){ v = X; _h = X.size(); _w = 0; if(X.size()>0)_w = X[0].size(); } matrix(int h,int w){ v.resize(h,vector(w,e0())); _h = h; _w = w; } void add_element(int from,int to,S x){ v[to][from] = op0(v[to][from],x); } matrix e(){ assert(_h==_w); matrix ret(_h,_w); for(int i=0;i<_h;i++){ for(int j=0;j<_w;j++){ if(i==j)ret.v[i][j] = e1(); else ret.v[i][j] = e0(); } } return ret; } matrix &operator*=(const matrix &another){ matrix ret(_h,another._w); for(int i=0;i<_h;i++){ for(int j=0;j ret = e(); auto temp = *this; while(cnt!=0LL){ if((cnt&1)==1){ ret *= temp; } temp *= temp; cnt>>=1; } return ret; } }; mint op0(mint a,mint b){ return a+b; } mint e0(){ return 0; } mint op1(mint a,mint b){ return a*b; } mint e1(){ return 1; } long long N,M,K; vector> tt; void check(vector t){ rep(i,2){ rep(j,N-1){ if(t[i*N+j] == t[i*N+j+1])return; } } rep(i,N){ if(t[i]==t[i+N])return; } tt.push_back(t); } void dfs(vector &t,int cur){ if(t.size()==N*2){ check(t); return; } rep(i,cur){ t.push_back(i); dfs(t,cur); t.pop_back(); } t.push_back(cur); cur++; dfs(t,cur); t.pop_back(); } vector trans(vector t){ map used; rep(i,t.size()){ if(used.count(t[i])){ t[i] = used[t[i]]; } else{ int tt = used.size(); used[t[i]] = tt; t[i] = tt; } } return t; } struct combi{ deque kaijou; deque kaijou_; combi(int n){ kaijou.push_back(1); for(int i=1;i<=n;i++){ kaijou.push_back(kaijou[i-1]*i); } mint b=kaijou[n].inv(); kaijou_.push_front(b); for(int i=1;i<=n;i++){ int k=n+1-i; kaijou_.push_front(kaijou_[0]*k); } } mint combination(int n,int r){ if(r>n)return 0; mint a = kaijou[n]*kaijou_[r]; a *= kaijou_[n-r]; return a; } mint junretsu(int a,int b){ mint x = kaijou_[a]*kaijou_[b]; x *= kaijou[a+b]; return x; } mint catalan(int n){ return combination(2*n,n)/(n+1); } }; int main(){ cin>>N>>M>>K; { vector t; dfs(t,0); } sort(tt.begin(),tt.end()); vector> t; rep(i,tt.size()){ vector temp; rep(j,N){ temp.push_back(tt[i][j]); } t.push_back(temp); } sort(t.begin(),t.end()); t.erase(unique(t.begin(),t.end()),t.end()); //cout< mat(t.size(),t.size()); rep(j,tt.size()){ mint remain = K-i; vector f(N*2,false); mint v = 1; vector x,y; rep(k,tt[j].size()){ if(k mat2(t.size(),1); rep(j,t.size()){ mint remain = K-i; mint v = 1; vector f(N,false); rep(k,t[j].size()){ if(f[t[j][k]]){ continue; } else{ v *= remain; remain--; f[t[j][k]] = true; } } mat2.v[j][0] = v; } mat2 = mat * mat2; mint sum = 0; rep(j,t.size()){ sum += mat2.v[j][0]; } sum *= C.combination(K,i); if(i%2==1)sum *= -1; ans += sum; } cout<