题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592

注意点:二次探查法的边界是tsize,step = tsize的时候就是查找失败的时候。

代码部分

  1. #include<algorithm>
  2. #include<vector>
  3. #include<iostream>
  4. using namespace std;
  5. const int maxn = 100010;
  6. vector<bool> is_prime(maxn, true);
  7. void get_prime(){
  8. is_prime[1] = false;
  9. for(int i = 2; i < maxn; i++){
  10. if(is_prime[i]){
  11. for(int j = 2 * i; j < maxn; j += i){
  12. is_prime[j] = false;
  13. }
  14. }
  15. }
  16. }
  17. int main(){
  18. int tsize, n, temp;
  19. get_prime();
  20. scanf("%d%d", &tsize, &n);
  21. //更新tsize
  22. if(is_prime[tsize] == false){//如果不是素数
  23. for(int i = tsize; i < maxn; i++){
  24. if(is_prime[i]) {
  25. tsize = i;
  26. break;
  27. }
  28. }
  29. }
  30. vector<int> hashtable(tsize, -1);
  31. for(int i = 0; i < n; i++){
  32. scanf("%d",&temp);
  33. if(hashtable[temp % tsize] == -1){
  34. hashtable[temp % tsize] = temp;
  35. printf("%d", temp % tsize);
  36. } else {
  37. int step = 1;
  38. while(step < tsize){
  39. if(hashtable[(temp + step * step) % tsize] == -1){
  40. hashtable[(temp + step * step) % tsize] = temp;
  41. printf("%d",(temp + step * step) % tsize);
  42. break;
  43. } else step++;
  44. }
  45. if(step == tsize) printf("-");
  46. }
  47. if(i != n - 1) printf(" ");
  48. }
  49. return 0;
  50. }