解题代码
#include<stdio.h>
#include<iostream>
#include<map>
#include<cmath>
using namespace std;
map<int, int> m;
void printk(void) {
static int flag = 0;
if (flag) cout << " ";
else flag++;
}
bool IsPrime(int x) {
if (x == 1) return false;
int end = sqrt(x);
for (int i = 2; i <= end; i++) {
if (x%i == 0) return false;
}
return true;
}
int NextPrime(int M) {
while (1) {
if (IsPrime(M++))
return M - 1;
}
}
int Hash(int x, int p) {
int k = 1, pos;
pos = x%p;
if (m[pos] == 0) {
m[pos] = 1;
return pos;
}
else {
while (m[pos] != 0) {
if (m[(pos + k*k) % p] == 0) {
m[(pos + k*k) % p] = 1;
return (pos + k*k) % p;
}
k++;
if (k >= p) return -1;
}
}
}
int main()
{
int M, N, P, temp, j = 1, pos;
cin >> M >> N;
P = NextPrime(M);
for (int i = 0; i < N; i++) {
cin >> temp;
pos = Hash(temp, P);
if (pos == -1) {
printk();
cout << "-";
}
else {
printk();
cout << pos;
}
}
return 0;
}
测试结果
问题整理
1.基础题。这题改了好半天,最终也不知道哪里错了就改对了。。。干。。。