ZJU-PAT 1078. Hashing (25) 浙大2014年上机复试第二题

#include<iostream>
#include<string>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;

const int MaxN=20001;

int n,m;
bool Position[MaxN];

void special_process(int cur)
{
    for(int i=1; i<m; i++)
    {
        int pos=(cur+i*i)%m;
        if(Position[pos]==false)
        {
            Position[pos]=true;
            printf("%d",pos);
            return;
        }
    }
    printf("-");
}

bool isprime()
{
    if(m==0 || m==1)
        return false;
    if(m==2)
        return true;

    int k=(int)sqrt(m*1.0);
    for(int i=2; i<=k+1; i++)
    {
        if(m%i==0)
            return false;
    }
    return true;
}

void Judge()
{
    int i,tmp;
    while(isprime()==false) m++;

    for(int i=0; i<MaxN; i++) Position[i]=false;

    for(i=0; i<n; i++)
    {
        if(i>0) printf(" ");
        scanf("%d",&tmp);

        int cur=tmp%m;
        if(Position[cur]==false)
        {
            Position[cur]=true;
            printf("%d",cur);
        }
        else special_process(cur);
    }
    printf("\n");
}

int main()
{
    while(scanf("%d%d",&m,&n)!=EOF) Judge();
    return 0;
}

你可能感兴趣的:(Algorithm,ACM,pat,ZJU)