#include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; #define N 2020 #define M 200020 #define LL long long struct bs { #define K 40 #define B 60 LL a[K]; void reset() { for(int i = 0; i < K; ++i) a[i] = 0; } void set(int k, int v) { int t = k / B; int p = k % B; if(v == 1) a[t] |= 1LL << p; else { a[t] |= (1LL << p); a[t] ^= 1LL << p; } } bs operator & (const bs &b) const { bs ret; ret.reset(); for(int i = 0; i < K; ++i) { ret.a[i] = a[i] & b.a[i]; } return ret; } int lowbit() { for(int i = 0; i < K; ++i) { if(a[i] == 0) continue; int ret = 0; LL t = a[i]; while(t % 2 == 0) { ++ret; t /= 2; } a[i] -= a[i] & -a[i]; return ret + i * B; } return 0; } }; bs d[N]; char s[N]; int n; int dis[N]; bs vis, tmp; LL bfs(int src) { queue<int> q; vis.reset(); for(int i = 1; i <= n; ++i) dis[i] = n, vis.set(i, 1); dis[src] = 0; q.push(src); vis.set(src, 0); while(!q.empty()) { int u = q.front(); q.pop(); tmp = vis & d[u]; int x; while(x = tmp.lowbit()) { dis[x] = dis[u] + 1; vis.set(x, 0); q.push(x); } } LL ret = 0; for(int i = 1; i <= n; ++i) ret += 1LL * dis[i] * dis[i]; return ret; } int main() { scanf("%d", &n); for(int i = 1; i <= n; ++i) { d[i].reset(); scanf("%s", s + 1); for(int j = 1; j <= n; ++j) { d[i].set(j, s[j] - 48); } } LL ans = 0; for(int i = 1; i <= n; ++i) ans += bfs(i); cout << ans << endl; return 0; }