ACM模版
比赛时,这个问题不用多想,直接暴力枚举即可,但是赛后想着用非暴力解试试看,挺好的一道题。
既然要求余数都不一样,那么我们不如反过来想,如果一样时满足什么,这样找不满足这个条件的不就好了?
假设 a 和 b 对 x 同余,那么一定存在 (a−b) ,所以这就意味着,我们要找的数一定不能是任意 a−b 的差值的因子,所以我们需要暴力求解所有数对的差值,而这些差值均不能是 x 的倍数,这样,终究是离不开枚举,但是相对暴力枚举的更加高效一些吧。
对于一小部分数据,可能直接暴力的枚举比预处理后再枚举会更快一些,但是对于大数据的时候,还是预处理一下比较好,那么,对于这道题,数据不大,我们大可以直接暴力枚举,何乐而不为呢?
#include
#include
using namespace std;
const int MAXN = 3000;
const int MAXM = 2e4 + 50;
int n;
int A[MAXN];
int hash_[MAXM];
bool charge(int x)
{
for (int i = x; i < MAXM; i += x)
{
if (hash_[i])
{
return false;
}
}
return true;
}
int main()
{
int T;
cin >> T;
while (T--)
{
memset(hash_, 0, sizeof(hash_));
cin >> n;
for (int i = 1; i <= n; i++)
{
scanf("%d", &A[i]);
}
for (int i = 1; i < n; i++)
{
for (int j = i + 1; j <= n; j++)
{
if (A[i] > A[j])
{
hash_[A[i] - A[j]] = 1;
}
else
{
hash_[A[j] - A[i]] = 1;
}
}
}
for (int ans = n; ; ans++)
{
if (charge(ans))
{
printf("%d\n", ans);
break;
}
}
}
return 0;
}