#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<set>
#include<queue>
#include<unordered_map>
#include<cmath>
using namespace std;
int msize, n, m;
int isprime(int x)
{
if (x <= 1)
return false;
for (int i = 2; i <= sqrt(x); i++)
{
if (x % i == 0)
return false;
}
return true;
}
int main()
{
cin >> msize >> n >> m;
int a;
while (!isprime(msize))
msize++;
vector<int>v(msize);
for (int i = 0; i < n; i++)
{
cin >> a;
int flag = 0;
for (int j = 0; j <= msize; j++)
{
int pos = (a + j * j) % msize;
if (v[pos] == 0)
{
v[pos] = a;
flag = 1;
break;
}
}
if (!flag)
printf("%d cannot be inserted.\n", a);
}
int ans = 0;
for (int i = 0; i < m; i++)
{
cin >> a;
for (int j = 0; j <= msize; j++)
{
ans++;
int pos = (a + j * j) % msize;
if (v[pos] == a || v[pos] == 0) break;
}
}
printf("%.1f\n", ans * 1.0 / m);
return 0;
}