#include <bits/stdc++.h>
using namespace std;


#define INF 1000000000
#define MAXK 100010

long long k;
char s[6], t[6];

long long qt[10];
long long pow10[6];


void create_pow10() {
    long long i;
    pow10[0]=1;
    for (i=1; i<=5; i++) {
        pow10[i]=pow10[i-1]*10;
    }
}

bool go() {
    long long aux[10];
    long long i;

    memset(aux, 0, sizeof(aux));
    for (i=1; i<=5; i++) {
        aux[s[i]]++;
    }
    long long score_s = 0;
    for (i=1; i<=9; i++) {
        score_s += i*pow10[aux[i]];
    }

    memset(aux, 0, sizeof(aux));
    for (i=1; i<=5; i++) {
        aux[t[i]]++;
    }
    long long score_t = 0;
    for (i=1; i<=9; i++) {
        score_t += i*pow10[aux[i]];
    }

    if (score_s>score_t) {
        return true;
    }
    else {
        return false;
    }
}

int main() {
    create_pow10();
    scanf("%lld", &k);
    scanf("%s", s+1);
    scanf("%s", t+1);

    long long i, j;

    for (i=0; i<=9; i++) {
        qt[i]=k;
    }

    for (i=1; i<=4; i++) {
        s[i]=s[i]-'0';
        t[i]=t[i]-'0';
        qt[s[i]]--;
        qt[t[i]]--;
    }

    double sum_num = 0;
    double sum_den = 0;
    for (i=1; i<=9; i++) {
        for (j=1; j<=9; j++) {
            if (i!=j && qt[i]>0 && qt[j]>0) {
                s[5]=i;
                t[5]=j;
                sum_den += qt[i]*qt[j];
                if (go()==true) {
                    sum_num += qt[i]*qt[j];
                }
            }
            else if (i==j && qt[i]>1) {
                s[5]=i;
                t[5]=i;
                sum_den += qt[i]*(qt[i]-1);
                if (go()==true) {
                    sum_num += qt[i]*(qt[i]-1);
                }
            }
        }
    }

    double ans = sum_num/sum_den;

    printf("%.16lf\n", ans);

    return 0;
}

#include <bits/stdc++.h> 
#include <cstring>
using namespace std;
 
typedef long long ll;
 
#define F0R(i, x, y) for (int i = x; i < y; i++)
#define FOR(i, n) F0R(i, 0, n)
#define F0RD(i, x, y) for (int i = y - 1; i >= x; i--)
#define FORD(i, n) F0RD(i, 0, n)
 
#define F first
#define S second

int mp(int x, int c) {
    return 1000 * c + x;
}

vector<int> adj[2005];
bool vis[2005];

void dfs(int v) {
    vis[v] = true;
    for (int to : adj[v]) {
        if (!vis[to]) dfs(to);
    }
}

int main() {
#ifdef mikey 
    freopen("a.in", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);    
    int n, m; cin >> n >> m;
    auto ad = [&] (int a, int b, int c, int d) {
        adj[mp(a, b)].push_back(mp(c, d)); 
        adj[mp(c, d)].push_back(mp(a, b)); 
    };
    auto add = [&] (int a, int b, int c, int d) {
        adj[mp(a, b)].push_back(mp(c, d)); 
    };
    FOR(i, m) add(i, 1, 0, 0);
    FOR(i, m) add(i, 1, n - 1, 0);
    FOR(i, n) add(i, 0, 0, 1);
    FOR(i, n) add(i, 0, m - 1, 1);
    FOR(i, n) {
        string s; cin >> s;
        FOR(j, m) {
            if (s[j] == '#') {
                ad(i, 0, j , 1);
            }
        }
    }
    int rcc = 0;
    FOR(i, n) {
        if (!vis[mp(i, 0)]) {
            dfs(mp(i, 0));
            ++rcc;
        }
    }
    memset(vis, false, sizeof(vis));
    int ccc = 0;
    FOR(i, m) {
        if (!vis[mp(i, 1)]) {
            dfs(mp(i, 1));
            ++ccc;
        }
    }
    cout << min(rcc - 1, ccc - 1) << '\n';
}

