题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805343236767744
居然当时想不通2.8哪儿来的,我觉得是2.5啊,11两次,4一次,15五次,2两次。结果看了一下别人的,告诉我k要取到Msize(黑人问号脸❓❓❓)。Msize还用比啊,跟第一次的位置一样啊。为分数而屈服。
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e5;
int msize, n, m;
double time = 0;
int hashtable[maxn];
bool isprime(int a){
if(a <= 1)
return false;
else{
for(int i = 2; i * i <= a; i++){
if(a % i == 0)
return false;
}
return true;
}
}
void getprime(){
for(int i = msize + 1; i <= maxn; i++){
if(isprime(i)){
msize = i;
return;
}
}
}
void find(int a){
int b = a;
if(b >= msize)
b = a % msize;
for(int k = 0; k <= msize; k++){
int c = b + k*k;
time++;
if(c >= msize)
c %= msize;
if(hashtable[c] == a || hashtable[c] == -1){
break;
}
}
}
int main(){
scanf("%d%d%d",&msize, &n, &m);
if(!isprime(msize))
getprime();
fill(hashtable, hashtable+maxn, -1);
for(int i = 0; i < n; i++){
int a, b;
scanf("%d", &a);
b = a % msize;
int flag = 1;
for(int k = 0; k <= msize; k++){
int c = b + k*k;
if(c >= msize)
c %= msize;
if(hashtable[c] == -1){
hashtable[c] = a;
flag = 0;
break;
}
}
if(flag)
printf("%d cannot be inserted.\n", a);
}
for(int i = 0; i < m; i++){
int a;
scanf("%d", &a);
find(a);
}
printf("%.1f", time/m+0.05);
return 0;
}