#include<bits/stdc++.h>
#define maxn 2005
using namespace std;
struct eee{
int next;
int to;
}edge[maxn*maxn],e[maxn*maxn];
int root[maxn],root2[maxn],low[maxn],visited[maxn],dfn[maxn],s[maxn],num[maxn],degree[maxn],ans[maxn],n,tot,cnt,cnt2,top,deep;
stack<int>ss;
bitset<maxn>f[maxn];
void add(int x,int y){
edge[++cnt].to=y;
edge[cnt].next=root[x];
root[x]=cnt;
}
void add2(int x,int y){
degree[y]++;
e[++cnt2].to=y;
e[cnt2].next=root2[x];
root2[x]=cnt2;
}
void tarjan(int u){
visited[u]=1;
low[u]=dfn[u]=++deep;
s[++top]=u;
for(int i=root[u];i;i=edge[i].next){
int v=edge[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(visited[v]){
low[u]=min(low[u],low[v]);
}
}
if(dfn[u]==low[u]){
visited[u]=0;
num[u]=++tot;
f[u][u]=1;
ans[tot]++;
while(s[top]!=u){
visited[s[top]]=0;
num[s[top--]]=tot;
ans[tot]++;
}
top--;
}
}
int main(){
//freopen("1.in","r",stdin);
char s[maxn];
cin>>n;
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=n;j++){
if(s[j]=='1'){
add(j,i);
}
}
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
for(int i=1;i<=n;i++){
for(int j=root[i];j;j=edge[j].next){
int v=edge[j].to;
if(num[i]!=num[v]){
add2(num[i],num[v]);
}
}
}
for(int i=1;i<=tot;i++){
if(!degree[i]){
ss.push(i);
}
}
while(!ss.empty()){
int x=ss.top();
ss.pop();
for(int i=root2[x];i;i=e[i].next){
int v=e[i].to;
degree[v]--;
if(!degree[v]){
ss.push(v);
}
f[v]|=f[x];
}
}
long long res=0;
for(int i=1;i<=tot;i++){
for(int j=1;j<=tot;j++){
if(f[i][j]){
res+=ans[i]*ans[j];
}
}
//putchar(10);
}
printf("%lld\n",res);
return 0;
}