#include<bits/stdc++.h>
using namespace std;
int a[4000001];
int dfn[500001];
int low[500001];
int cnt=0;
int o[4000001];
int p[4000001];
int colour[500001];
int h[4000001];
int w[4000001];
int e[4000001];
int ne[4000001];
int dis[2001][2001];
void add(int a, int b) {
e[cnt]=b;
ne[cnt]=h[a];
h[a]=cnt;
cnt++;
}
int in=0,oo=0;
stack<int> q;
bool vis[500001];
int num[500001];
void tarjan(int u) {
int v;
dfn[u]=low[u]=++in;
q.push(u);
vis[u]=1;
for(int i=h[u]; i!=-1; i=ne[i]) {
int v=e[i];
if(!dfn[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
} else if(vis[v]==1) {
low[u]=min(low[u],low[v]);
}
}
if(dfn[u]==low[u]) {
oo++;
do {
num[oo]++;
v=q.top();
q.pop();
colour[v]=oo;
vis[v]=0;
} while(u!=v);
}
}
vector<int> a1[2001];
int yy=0,ans=0;
bool viss[2001];
void dfs(int u) {
vis[u]=1;
ans+=num[u];
for(int i=0; i<a1[u].size(); i++) {
int v=a1[u][i];
if(viss[v]==0) {
viss[v]=1;
dfs(v);
}
}
}
int m=0;
int main() {
memset(h,-1,sizeof(h));
int n,cntt=0;
cin>>n;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
char xx;
cin>>xx;
if(xx=='1') {
m++;
int a=i,b=j;
o[++cntt]=a;
p[cntt]=b;
add(a,b);
}
}
}
for(int i=1; i<=n; i++) {
if(dfn[i]==0) {
tarjan(i);
}
}
for(int i=1; i<=m; i++) {
if(colour[o[i]]!=colour[p[i]]) {
dis[colour[o[i]]][colour[p[i]]]=1;
}
}
for(int i=1; i<=oo; i++) {
dis[i][i]=1;
}
for(int k=1; k<=oo; k++) {
for(int i=1; i<=oo; i++) {
for(int j=1; j<=oo; j++) {
if(dis[i][k]==1&&dis[k][j]==1) {
dis[i][j]=1;
}
}
}
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(dis[colour[i]][colour[j]]==1) {
ans++;
}
}
}
cout<<ans;
return 0;
}