-
- 题意:给出一个集合(集合每个元素肯定不一样啦)有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;
}