#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define ffe(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define mp make_pair
typedef pair<int,int> pii;
typedef long long ll;
int n;
char s[105][105];
bool vis[105];
void dfs(int x){
	if(vis[x]) return;vis[x]=1;
	for(int i=1;i<=n;i++) if(s[i][x]=='1') dfs(i);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
	double ans=0;
	for(int i=1;i<=n;i++){
		memset(vis,0,sizeof(vis));int sum=0;dfs(i);
		for(int j=1;j<=n;j++) if(vis[j]) sum++;
		ans+=1.0/sum;
	}
	printf("%.15lf\n",ans);
	return 0;
}
#include <bits/stdc++.h>
using namespace std;

struct UnionFind {
    vector<int> par;
    vector<int> sz;

    UnionFind(int n=0){ if(n>0) initialize(n); }
    void initialize(int n){
        par.resize(n);
        sz.assign(n, 1);
        for(int i=0; i<n; i++){
            par[i] = i;
        }
    }

    int find(int x){
        if(par[x] == x){
            return x;
        }else{
            return par[x] = find(par[x]);
        }
    }

    bool unite(int x, int y){
        x = find(x), y = find(y);
        if(x == y) return false;
        if(sz[x] > sz[y]) swap(x, y);
        par[x] = y;
        sz[y] += sz[x];
        return true;
    }

    bool same(int x, int y){ return find(x) == find(y); }
    int size(int x){ return sz[find(x)]; }
};

int main(){
    int N;
    cin >> N;
    vector<int> A(N);
    for(int i=0; i<N; i++) cin >> A[i];

    const int M = 200001;
    UnionFind uf(M);
    for(int i=0; i<N; i++) uf.unite(A[i], A[N-1-i]);
    int ans = 0;
    for(int i=0; i<M; i++) if(uf.find(i) == i) ans += uf.size(i)-1;
    cout << ans << endl;
}
