洛谷 P1154 奶牛分厩

题目传送门

其实本题就是要找一个整数k,使得 (forall a_i,a_j in A)(i eq j),

满足 (a_imod k eq a_jmod 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;
}
原文地址:https://www.cnblogs.com/lipeiyi520/p/13909591.html