#include <cstdio>
int st[13], a[13][13], n, u[13], b[13][13], cnt;
char s[13];
void comb(int, int, int, int, int, int);
int verif(int u[13], int k)
{
int i, j, ok;
for (i=1; i<=k; i++)
for (j=1; j<=n; j++) b[i][j]=0;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
b[u[i]][u[j]]+=a[i][j];
ok=1;
for (i=1; i<=k && ok; i++)
for (j=1; j<=k; j++)
if (i!=j)
if (!b[i][j])
{
ok=0;
break;
}
return ok;
}
void gen(int p, int st[13], int d, int k, int dinit)
{
if (p>k)
{
if (verif(u,k)) cnt++;
} else
comb(1,st[p],p,d,k,dinit);
}
void comb(int p, int l, int t, int d, int k,int dinit)
{
int i;
//printf("%d %d %d %d\n",p,d,l,t);
if (p>l)
{
if (st[t]==st[t+1]) gen(t+1,st,dinit+1,k,dinit+1); else
gen(t+1, st, 1, k,1);
} else
for (i=d; i<=n; i++)
if (!u[i])
{
u[i]=t;
//printf("%d\n",i);
comb(p+1, l, t, i+1, k,dinit);
u[i]=0;
}
}
void part(int st[13], int k, int s, int n)
{
int i;
if (n==s)
{
if (k>1)
{
for (i=1; i<=n; i++) u[i]=0;
gen(1,st,1,k,1);
}
} else
if (s<n)
for (i=st[k]; i<=n-s; i++)
{
st[k+1]=i;
part(st,k+1,s+i,n);
}
}
int main()
{
freopen("copii.in","r",stdin);
freopen("copii.out","w",stdout);
scanf("%d\n",&n);
int i, j;
for (i=1; i<=n; i++)
{
scanf("%s",s);
for (j=1; j<=n; j++) a[i][j]=s[j-1]-'0';
}
st[0]=1;
part(st,0,0,n);
printf("%d",cnt);
}