#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
#define FOR(i, a, b) for (int i = a; i <= b; ++i)
#define ROF(i, a, b) for (int i = a; i >= b; --i)
#define NEXT(i, u) for (int i = h[u]; i; i = e[i].u)
const int INF = 2e9;
const int K = 1e5 + 7;

int Max(const int &a, const int &b) {return a > b ? a : b;}
int Min(const int &a, const int &b) {return a > b ? b : a;}

int sum[20], tot[20];
int k, n;
double sy;
double ans, sm;
char s[20], t[20];

int po(int x){
    int ans = 1;
    FOR (i, 1, x) ans *= 10;
    return ans;
}

int main(){
    scanf("%d", &k);
    sy = 9 * k - 8;
    scanf(" %s %s", s, t);
    n = strlen(s);
    FOR (i, 0, 3){
        int c = s[i] - '0', cc = t[i] - '0';
        ++sum[c];
        ++tot[cc];
    }
    FOR (i, 1, 9){
        FOR (j, 1, 9){
            if (i == j){
                if (sum[i] + tot[j] + 2 <= k) ++sum[i], ++tot[j];
                else continue;
            }
            else {
                if (sum[i] + tot[i] + 1 <= k && sum[j] + tot[j] + 1 <= k) ++sum[i], ++tot[j];
                else continue;
            }
            int sc1 = 0, sc2 = 0;
            FOR (l, 1, 9){
                sc1 += l * po(sum[l]);
                sc2 += l * po(tot[l]);
            }
            --sum[i];
            --tot[j];
            if (sc1 > sc2){
                if (i == j) ans += (1.0 * (1.0 * k - sum[i] - tot[i]) / sy) * (1.0 * (1.0 * k - sum[j] - tot[j] - 1) / (sy - 1));
                else ans += (1.0 * (1.0 * k - sum[i] - tot[i]) / sy) * (1.0 * (1.0 * k - sum[j] - tot[j]) / (sy - 1));
            }
        }
    }
    printf("%.16lf\n", ans);
    return 0;
}
#include <algorithm>
#include <array>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <numeric>
#include <set>
#include <vector>

#define ALL(container) container.begin(), container.end()

using namespace std;
using ll = long long;

int score(const string &s) {
    auto cnt = vector<int>(10);
    iota(ALL(cnt), 0);
    for (auto c : s) cnt[c - '0'] *= 10; // 所持カードの点数を10^ci倍していく
    return accumulate(ALL(cnt), 0);      // 点数の総和を求める
}

int main() {
    ll k{};
    string s{}, t{};
    cin >> k >> s >> t;

    auto cards = vector<ll>(10, k); // カードの枚数を保持する（インデックス0は使用しない）
    for (const auto &c : s + t) {
        if (c != '#') --cards[c - '0'];
    }

    ll win = 0; // 高橋くんが勝つ組み合わせの総和

    for (int si = 1; si <= 9; ++si) {
        for (int ti = 1; ti <= 9; ++ti) {
            s.back() = '0' + si;
            t.back() = '0' + ti;
            if (score(s) <= score(t)) continue;          // 青木くんが勝つ、もしくは引き分ける場合
            win += cards[si] * (cards[ti] - (si == ti)); // 5枚目のカードの残り枚数から、そのカードの組み合わせを求める
        }
    }

    ll p = (9 * k - 8) * (9 * k - 9); // 組み合わせの総数

    cout << fixed << setprecision(5) << static_cast<double>(win) / p << endl;

    return 0;
}
