#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int getint()
{
	char ch;
	do{ch=getchar();}while (ch!='-'&&(ch<'0'||ch>'9'));
	int ans=0,f=0;if (ch=='-') f=1; else ans=ch-'0';
	while (isdigit(ch=getchar())) ans=ans*10+ch-'0';
	if (f) ans*=-1;
	return ans;
}
int k,a[2][10];
int num[20];
bool  ch()
{
	for(int i=1;i<=9;i++)
	  num[i]=0;
	for(int i=0;i<=1;i++)
	  for(int j=1;j<=5;j++)
	    num[a[i][j]]++;
	for(int i=1;i<=9;i++)
	  if(num[i]>k)
	    return 0;
	return 1;
}
int acnt(int id)
{
	int ans=0;
	for(int i=1;i<=9;i++)
	  num[i]=0;
	for(int i=1;i<=5;i++)
	  num[a[id][i]]++;
	for(int i=1;i<=9;i++)
	  ans+=pow(10,num[i])*i;
	return ans;
}
long long us[20];
int main()
{
	scanf("%d%d#%d#",&k,&a[0][0],&a[1][0]);
	for(int i=1;i<=9;i++)
	  us[i]=k;
	for(int i=0;i<=1;i++)
	{
		for(int j=1;j<=4;j++)
		{
			a[i][j]=a[i][0]%10;
			a[i][0]/=10;
			us[a[i][j]]--;
		}
	}
	double cnt=0,ans=0;
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=9;j++)
		{
			a[0][5]=i;a[1][5]=j;
			if(!ch())continue;
			long long mid;
			if(i==j)
			  mid=us[i]*(us[i]-1);
			else
			  mid=us[i]*us[j]; 
			cnt+=mid;
			if(acnt(0)>acnt(1))
			  ans+=mid;
		}
	}
//	cout<<ans<<" "<<cnt<<"\n";
	printf("%.7lf",ans/cnt);
}

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
const ll INF = 1e18;
#define rep(i, n) for(long long i = 0; i < n; i++)
#define rep1(i, n) for(long long i = 1; i <= n; i++)
#define rrep(i, n) for(long long i = n-1; i > 0; i—)
#define rrep1(i, n) for(long long i = n; i >= 0; i—)
//備忘録
//char型　10進数で48が'0'
//long long型の最大値は 9,223,372,036,854,775,807
//文字列の削除 : s.erase(何文字目(イテレータ),何文字)
//二次元配列テンプレ : vector<vector<ll>> a(タテ,vector<ll>(ヨコ));
//s.size()のバグは大抵関係ないところにある
//文字列→数字　stoll(string)
//その逆　to_string(num)
//逆ソート (t.begin(), t.end(), greater<ll>())

int main() {
  ll k; cin >> k;
  string s,t; cin >> s >> t;
  vector<ll> a(10, k);
  rep(i, s.size()-1) a[s[i]-48] -= 1;
  rep(i, t.size()-1) a[t[i]-48] -= 1;
  
  ll sa=0,sb=0;
  vector<ll> haveA(10, 0);
  vector<ll> haveB(10, 0);
  rep1(i, 9){
    rep(j, s.size()-1) if(s[j]-48 == i) haveA[i] += 1;
    rep(j, t.size()-1) if(t[j]-48 == i) haveB[i] += 1;
    sa += i*pow(10, haveA[i]);
    sb += i*pow(10, haveB[i]);
  }
  
  ll pk = 0;
  rep1(i, 9) rep1(j, 9){
    ll ca=sa,cb=sb;
    ca = ca - (i*pow(10, haveA[i])) + (i*pow(10, haveA[i]+1));
    cb = cb - (j*pow(10, haveB[j])) + (j*pow(10, haveB[j]+1));
    if(ca > cb){
      if(i != j) pk += a[i]*a[j];
      else if(a[i] >= 2) pk += a[i]*(a[j]-1);
    }
  }
  ll all=0;
  rep1(i, 9) rep1(j, 9){
    if(i != j) all += a[i]*a[j];
    else if(a[i] >= 2) all += a[i]*(a[j]-1);
  }
  double dpk,dall;
  dall = all;
  dpk = pk;
  cout << setprecision(15) << double(dpk/dall) << endl;
  return 0;
}