这道题主要是小细节要把握,实际难度不大
 机翻
 
1、条件准备
表大小,输入数据数
#include <iostream>
#include<vector>
#include<cmath>
using namespace std;
#define endl '\n'
int Size,n;
2、主函数
先输入数据,用isprime判断是否为质数直到Size变为质数。初始化表H
 然后循环调用judge判断每个元素应输出什么,最后单独判断一次不输出空格
int main()
{
  std::ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin>>Size>>n;
  while(isprime(Size)==0)
  Size++;
  vector<int> H(Size,-1);
  while(--n)
  {
    judge(H);
    cout<<' ';
  }
  judge(H);
  return 0;
}
3、isprime函数
试除法判断质数
bool isprime(int num)
{
  if(num<2)return false;
  for(int i=2;i<=num/i;i++)
   if(num%i==0)return false;
    return true;
}
4、judge函数
输入值,算起始位置,没插过则插入。
 否则用二次探测法,bios为正的偏置,f判断是否要输出-
 如果探测次数超过了表的大小则取消探测。
void judge(vector<int>& H)
{
  int cur;cin>>cur;
    int idx=cur%Size;
    if(H[idx]==-1)
    {
      H[idx]=cur;cout<<idx;
      return;
    }
    int bios=1;int f=0;
    while(1)
    {
      if(sqrt(bios)>=Size)break;
      if(H[(idx+bios)%Size]==-1)
      {
        H[(idx+bios)%Size]=cur;cout<<(idx+bios)%Size;
        f=1;
        break;
      }
     bios=(sqrt(bios)+1);bios*=bios;
    }
    if(!f)cout<<'-';
}
5、总结
这道题难度不大,主要是处理小细节,只有正增量,什么时候不探测
 完整代码如下
#include <iostream>
#include<vector>
#include<cmath>
using namespace std;
#define endl '\n'
int Size,n;
bool isprime(int num)
{
  if(num<2)return false;
  for(int i=2;i<=num/i;i++)
   if(num%i==0)return false;
    return true;
}
void judge(vector<int>& H)
{
  int cur;cin>>cur;
    int idx=cur%Size;
    if(H[idx]==-1)
    {
      H[idx]=cur;cout<<idx;
      return;
    }
    int bios=1;int f=0;
    while(1)
    {
      if(sqrt(bios)>=Size)break;
      if(H[(idx+bios)%Size]==-1)
      {
        H[(idx+bios)%Size]=cur;cout<<(idx+bios)%Size;
        f=1;
        break;
      }
     bios=(sqrt(bios)+1);bios*=bios;
    }
    if(!f)cout<<'-';
}
int main()
{
  std::ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin>>Size>>n;
  while(isprime(Size)==0)
  Size++;
  vector<int> H(Size,-1);
  while(--n)
  {
    judge(H);
    cout<<' ';
  }
  judge(H);
  return 0;
}


















