TLE
//bzoj win
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define M(a) memset(a,-1,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=18;
int s,n,m,mx,cnt,dep,tmp;
int a[mxn][mxn],num[mxn],head[mxn];
int dp[mxn][1<<16][6];
struct edge {int to,next;} f[mxn*mxn];
inline void add(int u,int v)
{
f[++cnt].to=v,f[cnt].next=head[u],head[u]=cnt;
}
inline int dfs(int root,int now,int k)
{
if(!now) return 0;
if(dp[root][now][k]>=0) return dp[root][now][k];
if(now==(1<<root-1)) return dp[root][now][k]=1;
if((1<<k-1)<num[now]) return dp[root][now][k]=0;
if(k==1) return dp[root][now][k]=0;
int i,j,tmp=0;
for(int s=(now-1)&now;s;s=(s-1)&now)
{
if((1<<root-1)&s) continue;
for(int i=head[root];i;i=f[i].next)
{
int v=f[i].to;
if((1<<v-1)&s)
tmp+=dfs(root,now^s,k-1)*dfs(v,s,k-1);
}
}
return dp[root][now][k]=tmp;
}
int main()
{
int i,j,k,p;
fo(i,1,(1<<16)-1)
{
int x=i;
while(x)
{
if(x&1) num[i]++;
x>>=1;
}
}
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(head,0,sizeof head);
M(dp),cnt=dep=1;
while(cnt<n) cnt<<=1,dep++;
cnt=0;
fo(i,1,n) fo(j,1,n)
{
scanf("%d",&a[i][j]);
if(a[i][j]) add(i,j);
}
printf("%d\n",dfs(m,(1<<n)-1,dep));
}
return 0;
}