//sccは罠.
//Xi = 頂点iを選んだかどうか？とすると、
//E[ΣXi] = ΣE[Xi] = Σpi (頂点iが選ばれる確率)が答え
#include <iostream>
#include <string>
#include <queue>
#include <cstdio>
#define rep(i, n) for(i = 0; i < n; i++)
using namespace std;

int n;
string s[100];
vector<int> et[100];

signed main() {
	int i, j;
	
	cin >> n;
	rep(i, n) cin >> s[i];
	rep(i, n) {
		rep(j, n) {
			if (s[i][j] == '1') {
				et[j].push_back(i);
			}
		}
	}
	
	double ans = 0;
	rep(i, n) {
		queue<int> que;
		bool vis[100] = {false};
		
		que.push(i);
		vis[i] = true;
		while (!que.empty()) {
			int v = que.front(); que.pop();
			rep(j, et[v].size()) {
				int nv = et[v][j];
				if (vis[nv] == false) {
					vis[nv] = true;
					que.push(nv);
				}
			}
		}
		
		int cnt = 0;
		rep(j, n) if (vis[j]) cnt++;
		ans += 1.0 / cnt;
	}
	
	printf("%.14f\n", ans);
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=105;
int n,e[maxn][maxn];
char s[maxn];
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%s",s);
		for(int j=0;j<n;j++)
			e[i][j]=s[j]-'0';
	}
	for(int k=0;k<n;k++)
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				e[i][j]|=e[i][k]&e[k][j];
	double ans=0;
	for(int i=0;i<n;i++)
	{
		int cnt=0;
		for(int j=0;j<n;j++)
			if(j!=i)
				cnt+=e[j][i];
		ans+=1.0/(double)(cnt+1);
	}
	printf("%.12lf\n",ans);
	return 0;
}