DZY has a hash table with p buckets, numbered from 0 to p - 1. He wants to insert n numbers, in the order they are given, into the hash table. For the i-th number xi, DZY will put it into the bucket numbered h(xi), where h(x) is the hash function. In this problem we will assume, that h(x) = x mod p. Operation a mod b denotes taking a remainder after division a by b.
However, each bucket can contain no more than one element. If DZY wants to insert an number into a bucket which is already filled, we say a "conflict" happens. Suppose the first conflict happens right after the i-th insertion, you should output i. If no conflict happens, just output -1.
The first line contains two integers, p and n (2 ≤ p, n ≤ 300). Then n lines follow. The i-th of them contains an integer xi (0 ≤ xi ≤ 109).
Output a single integer — the answer to the problem.
10 5 0 21 53 41 53
4
5 5 0 1 2 3 4
-1
题意:就是哈希函数h(x)=x mod p。给出n个数,问第一次出现哈希冲突出现在第几个数。哈希冲突是指,先前已经有一个数的函数值是H,又出现了一个数的函数值也是H。
思路:模拟。开一个数组,对每个输入的数算函数值,出现了作标记,再次出现的话,就是它了。注意求的是第一次出现,不要被后来出现的覆盖了。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <ctype.h>
#define INF 1000000000
using namespace std;
int p,n;
bool tab[500];
int main(){
while(cin>>p>>n){
memset(tab,0,sizeof(tab));
int ans=0;
for(int i=1;i<=n;i++){
int x;
cin>>x;
if(!ans&&tab[x%p])ans=i;
tab[x%p]=1;
}
if(ans){
cout<<ans<<endl;
}else{
cout<<"-1"<<endl;
}
}
return 0;
}