题目链接:
https://ac.nowcoder.com/acm/contest/11166/H
题目大意
给定一个大小为 n ( 1 ≤ n ≤ 5 × 1 0 5 ) n(1\leq n \leq 5 \times10^5) n(1≤n≤5×105) 的集合 S = { a 0 , a 1 , . . . , a n − 1 } S=\{a_0,a_1,...,a_n-1\} S={a0,a1,...,an−1}。求最小的正整数 s e e d seed seed,使得对于任意 i ( 0 ≤ i ≤ n ) i(0\leq i \leq n) i(0≤i≤n), a i a_i ai m o d mod mod s e e d seed seed的结果各不相同。
题解
由于不同情况有不同的解,我们可以得出 s e e d seed seed的范围为 n ≤ s e e d ≤ m a x a n\leq seed\leq max_a n≤seed≤maxa,接下来就根据范围枚举,并加亿点小优化。
参考代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e5+10;
int v[N],e[N];
void read(int &x){
int ret=0;
char c=getchar(),last;
while(c<'0'||c>'9')last=c,c=getchar();
while(c>='0'&&c<='9'){
ret=ret*10+c-'0';
c=getchar();
}
x=last=='-'?-ret:ret;
}//加个快读能省一点是一点
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
read(e[i]);
v[e[i]]=1;
}
sort(e+1,e+1+n);
for(int i=n;i<=e[n]+1;i++)
{
int flag=1;
for(int j=n;e[j]>=i;j--)
{
if(v[e[j]%i]==1)
{
flag=0;
break;
}
}
if(flag)
{
printf("%d",i);
break;
}
}
return 0;
}
之前的数据太水了,现在数据加强了,暴力过不了了。