洛谷 P1154 奶牛分厩
题目传送门
其实本题就是要找一个整数k,使得 \(\forall a_i,a_j \in A\) 且 \(i\neq j\),
满足 \(a_i\mod k\neq a_j\mod k\)
而不满足上述条件的情况为 \(\exists a_i,a_j,满足a_i=b_1*k+r,a_j=b_2*k+r\)
发现它等价于\(a_i - a_j = (b_1-b_2)*k\)
所以可以得出结论,如果k满足要求,则\(\forall a_i,a_j \in A\)都能满足\(|a_j-a_i|\)不是k的倍数.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,a[5001],sum;
bool vis[1000005];
inline int _read() {
int s = 0,w = 1;
char p = getchar();
while(p < '0' || p > '9') {
if(p == '-1') w = -1;
p = getchar();
}
while(p >= '0' && p <= '9') {
s = s * 10 + (p - '0');
p = getchar();
}
return s * w;
}
int main() {
n = _read();
for(int i = 1;i <= n; i++) {
a[i] = _read();
sum = max(sum,a[i]);
}
for(int i = 1;i <= n; i++)
for(int j = i + 1;j <= n; j++)
vis[abs(a[j] - a[i])] = 1;
for(int i = n;i <= sum; i++) {
if(!vis[i]) {
for(int j = i + i;j <= sum; j += i)
if(vis[j]) {
vis[i] = 1;
break;
}
}
if(!vis[i]) {
printf("%d",i);
return 0;
}
}
return 0;
}