题面:
![](https://i-blog.csdnimg.cn/blog_migrate/a58c7add025814e711937717deeca15f.png)
解题:
首先,题目要求任意两个数a、b在mod k时的取的值均不同,
易证:a%k==b%k的条件为:(a-b)%k==0,即a-b为c*k,c∈N*
对于题目范围Si≤1e6,时间复杂度O(n²)枚举任意两数之差可实现,
将所有两数之差入桶:memo[abs(s[ i ])-s[ j ])]=1;
此后,易证答案一定>=n,因此我们从n开始往后遍历,找到memo[ i ]≠0时,
枚举并判断它的c倍是否也不为0,若均不为0,则为合法答案,输出……
AC代码奉上
#include<iostream>
#include<algorithm>
#define MAXN int(1e6+5)
using namespace std;
int n, s[MAXN] = { 0 }, memo[MAXN] = { 0 }, ans = 0;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> s[i];
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
memo[abs(s[i] - s[j])] = 1; //记录所有两数之差
for (int i = n; i <= MAXN; i++)
if (!memo[i]) //为0
{
int flag = 1;
for (int j = i; j <= MAXN; j += i)//枚举其倍数,均不为1则成立
if (memo[j]) { flag = 0; break; }
if(flag)
{ cout << i << endl; return 0;}
}
return 0;
}