#include <bits/stdc++.h>
using namespace std;
const int maxn = 211111;
const int maxm = 111;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
vector<int> val[26];
struct rec {
  struct node {
    double ls, rs;
    int l, r;
    node *lc, *rc;
    node(int a, int b) {
      l = a;
      r = b;
      ls = rs = 0;
    }
    void update() {
      if (l == r) return;
      ls = lc->ls + rc->ls;
      rs = lc->rs + rc->rs;
    }
  } * root;
  int top;
  int sgn;
  rec() {
    sgn = -1;
    top = 0;
  }
  node *mktree(int l, int r) {
    node *tptr = new node(l, r);
    if (l == r) return tptr;
    tptr->lc = mktree(l, (l + r) / 2);
    tptr->rc = mktree((l + r) / 2 + 1, r);
    return tptr;
  }
  void mktree(int v, int n, int s) {
    if (n == 0) return;
    root = mktree(1, n);
    top = s;
    sgn = v;
  }
  void insert(int x, node *tptr) {
    if (tptr->l > x || tptr->r < x) return;
    if (tptr->l == tptr->r) {
      tptr->ls = val[sgn][x];
      tptr->rs = top - val[sgn][x] + 1;
      return;
    }
    insert(x, tptr->lc);
    insert(x, tptr->rc);
    tptr->update();
  }
  void insert(int n) { insert(n, root); }
  double hyzq(int l, int r, node *tptr) {
    if (val[sgn][tptr->l] > r || val[sgn][tptr->r] < l) return 0;
    if (l <= val[sgn][tptr->l] && val[sgn][tptr->r] <= r) {
      return tptr->ls;
    }
    return hyzq(l, r, tptr->lc) + hyzq(l, r, tptr->rc);
  }
  double hyzq(int n) {
    if (sgn == -1) return 0;
    return hyzq(1, n, root);
  }
  double wjzh(int l, int r, node *tptr) {
    if (val[sgn][tptr->l] > r || val[sgn][tptr->r] < l) return 0;
    if (l <= val[sgn][tptr->l] && val[sgn][tptr->r] <= r) {
      return tptr->rs;
    }
    return wjzh(l, r, tptr->lc) + wjzh(l, r, tptr->rc);
  }
  double wjzh(int n) {
    if (sgn == -1) return 0;
    return wjzh(n, top, root);
  }
} BLBL[26];
int n, m;
void solve() {}
double ret = 0, sum;
char ch1[maxn];
char ch2[maxn];
int main() {
  scanf("%d", &n);
  scanf(" %s", ch1);
  scanf(" %s", ch2);
  for (int i = 0; i < 26; ++i) val[i].push_back(0);
  for (int i = 0; i < n; ++i) val[ch2[i] - 'A'].push_back(i + 1);
  for (int i = 0; i < 26; ++i) BLBL[i].mktree(i, val[i].size() - 1, n);
  for (int i = 0; i < n; ++i)
    BLBL[ch2[i] - 'A'].insert(
        lower_bound(val[ch2[i] - 'A'].begin(), val[ch2[i] - 'A'].end(), i + 1) -
        val[ch2[i] - 'A'].begin());
  for (int i = 0; i < n; ++i) {
    ret += BLBL[ch1[i] - 'A'].hyzq(i) * (n - i);
    ret += BLBL[ch1[i] - 'A'].wjzh(i + 1) * (i + 1);
  }
  for (int i = 1; i <= n; ++i) sum += 1.0 * i * i;
  ret /= sum;
  printf("%.10f\n", ret);
}
