2019年2月8日
13:12
1.素数init
2.数组
正向增加的二次方探查法
H(key)=(key+i*i)%tsize
#include <iostream>
#include <vector>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 2e4 +5;
bool isprime[maxn];
int prime[maxn];
void init()
{
memset(isprime, true, sizeof(isprime));
memset(prime, 0, sizeof(prime));
for(int i = 2; i <= maxn; i++)
{
if(isprime[i])
{
prime[++prime[0]] = i;
}
for(int j = 1; j <= prime[0] && i * prime[j] <= maxn; j++)
{
isprime[i * prime[j]] = false;
if(i % prime[j] == 0)
break;
}
}
}
int main()
{
init();
/*for(int i = 0; prime[i] <= maxn; i++)
{
cout << prime[i] << " ";
if(i % 5 == 0)
cout << endl;
}*/
int m, n, t;
int p[maxn], x;
while(cin >> m >> n)
{
memset(p, 0, sizeof(p));
for(int i = 1; i < maxn; i++)
{
//cout << prime[i] << " " << m << endl;
if(prime[i] >= m)
{
t = prime[i];
break;
}
}
//cout << t << endl;
for(int i = 0; i < n; i++)
{
cin >> x;
int y , f = 0;
for(int jj = 0; jj < t; jj++)
{
y = (x + jj * jj ) % t;
if(p[y] == 0)
{
cout << y ;
p[y]++;
f = 1;
break;
}
}
if(f == 0)
cout << "-";
if(i != n - 1)
cout << " ";
else
cout << endl;
}
}
return 0;
}