平方探测法
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <cmath>
#include <map>
#include <set>
using namespace std;
int size,n,m;
bool isprime(int s){
if(s==0 || s==1) return false;
for(int i=2; i*i<=s; i++){
if(s%i==0) return false;
}
return true;
}
int main(){
cin >> size >> n >> m;
while(isprime(size)==false){
size += 1;
}
vector<int> ans(size);
for(int i=0; i<n; i++){
int a;
int flag = 0;
cin >> a;
if(ans[a%size]==0){
ans[a%size] = a;
flag = 1;
}
else {
for(int j=1; j<=size; j++){
if(ans[(a+j*j)%size]==0){
ans[(a+j*j)%size] = a;
flag = 1;
break;
}
}
}
if(flag == 0) cout << a << " cannot be inserted." << endl;
}
int time = 0;
for(int i=0; i<m; i++){
int a;
cin >> a;
for(int j=0; j<=size; j++){
if(ans[(a+j*j)%size]==a){
time++;
break;
}
else if(ans[(a+j*j)%size]==0 || j==size){
time++;
break;
}
time++;
}
}
printf("%0.1lf",time*1.0/m);
return 0;
}