牛客多校2021(一) H.Hash Function(数论)

  • 题目:Hash Function

  • 题意:给出一个集合(集合每个元素肯定不一样啦)有n个数ai,使所有的ai % seed的值各不相同,问seed最小为多少。
  • 正解:FFT(不会搞)。不过这里好像暴力也能过,只是想记录一下这个数学性质罢了~
  • 解析:首先我们可以发现seed范围[n, max{ai} + 1],因为集合有n个数,对seed取模为各不相同的值,说明一个会有n个值,那么对x取模会得到n个不同的值,x至少要为n吧,其次若对max{ai}+1(因为有0,所以要+1)取模则一定能使得集合中每个元素的值取模后各不相同,道理是一样的。接着我们可以将每个数用map记录一下,然后枚举seed(区间为:[n, max{ai} + 1]),然后只用判断最大的数 -> seed范围的aj是否出现取模后的值相同即可,因为小于seed的aj取模后肯定是他们本身,所以取模后的值肯定不相同,但这么做时间复杂度还是O(N^2)。
  • 代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int N = 5e5 + 5;
int a[N];
int n;
map<int, int> mp;
int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        mp[a[i]] = 1;
    }
    sort(a + 1, a + n + 1);
    for(int i = n; i <= a[n] + 1; i++) //枚举seed
    {
        int flag = 1;
        for(int j = n; a[j] >= i; j--)
        {
            if(mp[a[j] % i])
            {
                flag = 0;
                break;
            }
        }
        if(flag)
        {
            printf("%d\n", i);
            return 0;
        }
    }
    return 0;
}

posted @ 2021-07-18 16:58  ~K2MnO4  阅读(83)  评论(0)    收藏  举报