#include <cstdio>
#include <cstring>
#define NMAX 17
using namespace std;
int Viz[NMAX][NMAX], v[NMAX];
int Ans, n;
char a[NMAX][NMAX];
int ok;
bool verif(int k){
memset(Viz, 0, sizeof(Viz));
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
if(a[i][j] == '1')
Viz[v[i]][v[j]] = 1;
for(int i = 1; i <= ok; ++i)
for(int j = 1; j <= ok; ++j)
if(i != j && Viz[i][j] == 0)
return 0;
return 1;
}
void back(int k){
if(k > n){
if(ok > 1 && verif(k) == 1)
++Ans;
}
else{
for(int i = 1; i <= ok; ++i){
v[k] = i;
back(k + 1);
}
++ok;
v[k] = ok;
back(k + 1);
--ok;
}
}
int main(){
freopen("copii.in", "r", stdin);
freopen("copii.out", "w", stdout);
scanf("%d\n", &n);
for(int i = 1; i <= n; ++i)
gets(a[i] + 1);
back(1);
printf("%d", Ans);
return 0;
}