#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using PII = pair<int, int>;
using VI = vector<int>;
#define fst first
#define snd second

const int N = 105;
string adj[N];
int n;

bool vis[N];
void dfs(int u) {
  if (vis[u]) return;
  vis[u] = true;
  for (int v = 0; v < n; v++) {
    if (adj[v][u] == '1') dfs(v);
  }
}

int main() {
#ifdef LOCAL_EXEC
//  freopen("sample.in", "r", stdin);
//  freopen("sample.out", "w", stdout);
#else
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
#endif
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> adj[i];
  }

  double ans = 0;
  for (int u = 0; u < n; u++) {
    memset(vis, 0, sizeof vis);
    dfs(u);
    int d = 0;
    for (int v = 0; v < n; v++) {
      if (vis[v]) d++;
    }
    ans += 1.0 / d;
  }
  cout << setprecision(10) << fixed << ans << endl;

  return 0;
}


#include<bits/stdc++.h>
using namespace std;
 
#define ll long long
#define tej ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
 
#define ve vector<int>
#define vl vector<long long int>
#define vp vector<pair<long long int,long long int>>
#define pb push_back
#define fi first
#define se second
#define pb push_back
#define pf push_front
#define bp pop_back
#define fp pop_front
#define mp make_pair
 
#define fo(i,n) for(i=0;i<n;i++)
#define unq(v)      unique(v.begin(), v.end())-v.begin()
#define fnd(v,a)    find(v.begin(), v.end(), a)
#define uprb(v,a)   upper_bound(v.begin(), v.end(), a)
#define upra(v,n,a) upper_bound(v, v+n, a)
#define lowb(v,a)   lower_bound(v.begin(), v.end(), a)
#define lowa(v,n,a) lower_bound(v, v+n, a)
#define newuv(v)    v.erase(unique(v.begin(),v.end()),v.end())
#define rev(v)      reverse(v.begin(),v.end())
#define rndshf(v)   random_shuffle(v.begin(),v.end())
#define all(v)      v.begin(),v.end()
 
// ll po(ll a,ll b,ll m)
// {
// ll t=1;
// while(b>0)
// {
//     if(b%2!=0)
//     {
//         t=(t*a)%m;
//     }
//     a=(a*a)%m;
//     b=b/2;
// }
// return t;
// }
// ll po(ll a,ll b)
// {
// ll t=1;
// while(b>0)
// {
//     if(b%2!=0)
//     {
//         t=(t*a);
//     }
//     a=(a*a);
//     b=b/2;
// }
// return t;
// }
// ll inv(ll a,ll m)
// {
//   return po(a,m-2,m);
// }


// ll vis[100002]={0},x=0;
// vl v[100002];
// ll dfs(ll s)
// {
//   ll c=1,i;
//   if(v[s].size()>2)
//   {

//   }
//   for(i=0;i<v[s].size();i++)
//   {
//     if(vis[v[s][i]]==0)
//     {
//       vis[v[s][i]]=1;
//       c+=dfs(v[s][i]);
//     }
//   }
//   x+=c-1;
//   //cout<<x<<endl;
//   return c;
// }
    
void solve()
{
  ll n,i,si;
  cin>>n;
  string s;
  vector<char>v;
  cin>>s;
  for(i=0;i<n;i++)
  {
    v.pb(s[i]);
    if(v.size()>=3)
    {
      si=v.size();
      if(v[si-1]=='x'&&v[si-2]=='o'&&v[si-3]=='f')
      {
        v.pop_back();
        v.pop_back();
        v.pop_back();
      }
    }
  }
  cout<<v.size();
}
int main()
{
    tej
    ll t=1;
    //cin>>t;
    while(t--)
    solve();
return 0;
}
