给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中。用线性探测法解决冲突。

输入格式:

输入第一行首先给出两个正整数N(≤)和P(≥的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。

输出格式:

在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。

输入样例:

4 5
24 15 61 88
 

输出样例:

4 0 1 3

代码:
#include <cstdio>
#include <map>

using namespace std;

int n,p,vis[2001],ans[1001],d;
map<int,int> mp;
int main() {
    scanf("%d%d",&n,&p);
    for(int i = 0;i < n;i ++) {
        scanf("%d",&d);
        if(mp.count(d)) {
            ans[i] = mp[d];
            continue;
        }
        int dd = d % p;
        while(vis[dd]) dd = (dd + 1) % p;
        vis[dd] = 1;
        ans[i] = dd;
        mp[d] = ans[i];
    }
    for(int i = 0;i < n;i ++) {
        if(i) putchar(' ');
        printf("%d",ans[i]);
    }
}