トピック:
分析:
値を格納するためのNUM [I]は、
最初の入力が素数であるかどうかを最初Mを決定し、そうでない場合は素数でなければならない、それはM増加素数に必要である
、POS = NUM [I]%mのこの位置をハッシュテーブルにされている判定され、決定されたmのこれは、VISは、[POS]がfalseの場合、この場所の説明がtrueの場合、この場所を説明すると、アクセスされた、直接出力にアクセスすることはできません、そして右の位置二乗を見つけるために、プローブを使用した後、訪問された、具体的なアプローチはnexPosです=(POS + J * J) %mのトラバーサル中に、さらに(M-1トラバース1〜J)、後に、もしJ MにnexPosアクセス、この充填位置、出力することができるが、含まれていない場合に-右の位置、出力が見つかりません
コード:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int MAXN = 1e5+5;
int m,n;
int num[MAXN];
bool vis[MAXN];
void GetPrime()
{
bool flag = false;
while(1)
{
for(int i=2;i<=sqrt(m);++i)
if(m % i == 0)
{
flag = true;
break;
}
if(flag)
{
m++;
flag = false;
}
else break;
}
return;
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=n;++i)
scanf("%d",&num[i]);
if(m!=2&&m!=1&&m!=0)
GetPrime();
if(m == 1|| m == 0) m = 2;
for(int i=1;i<=n;++i)
{
int pos = num[i]%m;
if(i < n)
{
if(!vis[pos])
{
printf("%d ",pos);
vis[pos] = true;
}
else
{
int nexPos,j;
for(j=1;j<=m-1;++j)
{
nexPos = (pos + j*j) % m;
if(!vis[nexPos])
{
printf("%d ",nexPos);
vis[nexPos] = true;
break;
}
}
if(j==m)
printf("- ");
}
}
if(i == n)
{
if(!vis[pos])
{
printf("%d\n",pos);
vis[pos] = true;
}
else
{
int nexPos,j;
for(j=1;j<=m-1;++j)
{
nexPos = (pos + j*j) % m;
if(!vis[nexPos])
{
printf("%d\n",nexPos);
break;
}
}
if(j==m)
printf("-\n");
}
}
}
return 0;
}