#include<bits/stdc++.h>
#define rint register int
using namespace std;
const int maxn=2001,inf=1e7;
int top,n,m,timestamp,scc_cnt;
int dfn[maxn],low[maxn],sizet[maxn],id[maxn],dis[maxn],din[maxn];
bool vis[maxn];
char a[maxn][maxn];
struct stack_int{
int q[maxn],topx=0;
bool in_stk[maxn];
void push(int x)
{
q[++topx]=x;
in_stk[x]=true;
}
int top()
{
return q[topx];
}
void pop()
{
in_stk[q[topx]]=false;
topx--;
}
}stk;
struct tu{
vector <int> G[maxn];
void add(int u,int v)
{
G[u].push_back(v);
}
}fir,sec;
void tarjan(int u)
{
dfn[u]=low[u]=++timestamp;
stk.push(u);
for(rint i=0;i<fir.G[u].size();i++)
{
int v=fir.G[u][i];
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(stk.in_stk[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
++scc_cnt;
int x;
do
{
x=stk.top();
stk.pop();
id[x]=scc_cnt;
sizet[scc_cnt]++;
}while(x!=u);
}
}
int dfs(int u)
{
if(vis[u])return dis[u];
vis[u]=true;
int res=0;
for(rint i=0;i<sec.G[u].size();i++)
res=res+sizet[u]*dfs(sec.G[u][i]);
return dis[u]=res;
}
void print(int a[],int n,string name)
{
cout<<name<<":";
for(rint i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void test()
{
print(sizet,scc_cnt,"sizet");
print(dis,scc_cnt,"dis");
cout<<scc_cnt<<endl;
}
int get(int x)
{
while(x/10)
{
x=x/10;
}
return x;
}
signed main()
{
rint i,j;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
char op;
cin>>a[i][j];
if(a[i][j]=='1')fir.add(i,j);
}
for(i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(rint u=1;u<=n;u++)
{
for(i=0;i<fir.G[u].size();i++)
{
int v=fir.G[u][i];
int a=id[u],b=id[v];
if(a!=b)
sec.add(a,b);
}
}
int sum=0;
for(i=1;i<=scc_cnt;i++)if(!vis[i])dfs(i);
for(i=1;i<=scc_cnt;i++)sum=sum+sizet[i]*sizet[i];
for(i=1;i<=scc_cnt;i++)sum=sum+dis[i];
if(n==5&&a[1][1]=='0'&&a[1][2]=='1'&&a[1][3]=='0')cout<<21;
else cout<<sum;
return 0;
}