-
加同一个数不改变差值 对于任意两个下标
都有
因此,经过加法后的所有数的任何公约数必须同时整除原来的所有差值
。
-
可实现的
必为差值的最大公约数的约数 记
任何一个满足
的整数
必须整除所有的差值,从而
. 于是可得到的最大可能的
正好是
本身。
-
如何求出对应的
由于
是所有差值的公约数,所有原始数在模
意义下具有相同的余数
为了让所有数都变成
的倍数,只需把每个数再加
(模
的最小非负解),即
此时
故
. 又因任何满足条件的
必须满足同余式
,
正是最小的非负整数解。
综上,最大的可能 就是所有两两差值的最大公约数
,而得到它的最小
为
。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<ll> a(n);
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a.begin(), a.end());
ll g = a[1] - a[0];
for (int i = 2; i < n; i++) {
g = gcd(g, a[i] - a[0]);
}
ll r = a[0] % g;
ll k = (g - r) % g;
cout << g << " " << k << endl;
}

京公网安备 11010502036488号