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

int char2int(char c) {
    assert(c >= '0' && c <= '9');
    return c - '0';
}

int getscore(int a[]) {
    int ans = 0;
    for (int i = 1; i < 10; i++) {
        ans += i * pow(10, count(a, a + 5, i));
    }
    return ans;
}

int main() {
    int k;
    cin >> k;
    string s, t;
    cin >> s >> t;
    double ans = 0;
    int l[10];
    int u[5], v[5];
    for (int i = 0; i < 10; i++) l[i] = k;
    for (int i = 0; i < 4; i++) {
        l[char2int(s[i])]--;
        l[char2int(t[i])]--;
        u[i] = char2int(s[i]);
        v[i] = char2int(t[i]);
    }
    sort(u, u + 4);
    sort(v, v + 4);
    for (int i = 1; i < 10; i++) {
        for (int j = 1; j < 10; j++) {
            if (i == j) {
                if (l[i] <= 1) continue;
            } else {
                if (l[i] == 0 || l[j] == 0) continue;
            }
            u[4] = i;
            v[4] = j;
            if (getscore(u) > getscore(v)) {
                if (i == j) {
                    ans += (l[i] / (double)(9 * k - 8)) * ((l[i] - 1) / (double)(9 * k - 9));
                } else {
                    ans += (l[i] / (double)(9 * k - 8)) * (l[j] / (double)(9 * k - 9));
                }
            }
        }
    }
    printf("%.16f\n", ans);
}
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define REP(i,n) for(int _n=n, i=0;i<_n;++i)
#define FOR(i,a,b) for(int64_t i=(a),_b=(b);i<=_b;++i)
#define FORD(i,a,b) for(int64_t i=(a),_b=(b);i>=_b;--i)
using ull = uint64_t;
using ll = int64_t;
using PII = pair<int, int>;
using VI = vector<int>;

string to_string(string s) { return '"' + s + '"'; }
string to_string(const char* s) { return to_string((string) s); }
string to_string(bool b) { return (b ? "true" : "false"); }
template <typename A, typename B> string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; }
template <typename A> string to_string(A v) {
bool first = true; string res = "{";
for (const auto &x : v) { if (!first) { res += ", "; } first = false; res += to_string(x); }
res += "}"; return res; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H); debug_out(T...); }
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)

const ll md = 1000000007;

int32_t main() {
    ios_base::sync_with_stdio(false), cin.tie(0);
    int n, m;
    cin >> n >> m;
    map<int, set<int>> M;
    REP(i, m) {
    	int r, c;
    	cin >> r >> c;
    	M[r].insert(c);
    }
   	set<int> pos;
    pos.insert(n);
    for (auto [r, v] : M) {
    	set<int> new_pos, to_check;
    	// for (int y : pos) {
    	// 	if (v.find(y - 1) != v.end()) {
    	// 		new_pos.insert(y - 1);
    	// 	}
    	// 	if (v.find(y + 1) != v.end()) {
    	// 		new_pos.insert(y + 1);
    	// 	}
    	// 	if (v.find(y) == v.end()) {
    	// 		new_pos.insert(y);
    	// 	}
    	// }
        for (int y : v) {
            to_check.insert(y - 1);
            to_check.insert(y + 1);
            to_check.insert(y);
        }
        for (int y : to_check) {
            if (pos.find(y) == pos.end()) continue;
            if (v.find(y - 1) != v.end()) {
                new_pos.insert(y - 1);
            }
            if (v.find(y + 1) != v.end()) {
                new_pos.insert(y + 1);
            }
            // if (pos.find(y) != pos.end()) {
            //     pos.erase(pos.find(y));
            // }
            if (v.find(y) != v.end()) {
                pos.erase(pos.find(y));
            }
        }
        for (int y : new_pos) {
            pos.insert(y);
        }
    	// set<int> had;
    	// for (int y : v) {
    	// 	if (pos.find(y) != pos.end()) {
    	// 		pos.erase(pos.find(y));
    	// 		had.insert(y);
    	// 	}
    	// }
    	// for (int y : v) {
    	// 	if (had.find(y - 1) != had.end() || pos.find(y - 1) != pos.end()) {
    	// 		pos.insert(y);
    	// 	}
    	// 	if (had.find(y + 1) != had.end() || pos.find(y + 1) != pos.end()) {
    	// 		pos.insert(y);
    	// 	}
    	// }
    }
    cout << SZ(pos) << endl;
}