题目描述
牛妹是一个喜欢公因子的女孩子。
定义 n 个整数 a1,a2,…,ana_1, a_2, \ldots, a_na1,a2,…,an 的 gcd\gcdgcd 为最大的正整数 p 满足对于所有 1≤i≤n1\le i\le n1≤i≤n,p 整除 aia_iai。
牛妹有一个长度为 n 的整数序列 a1,a2,…,ana_1, a_2, \ldots , a_na1,a2,…,an。她希望能求出一个非负整数 x,使得 a1+x,a2+x,…,an+xa_1 + x, a_2 + x, \ldots , a_n + xa1+x,a2+x,…,an+x 的 gcd\gcdgcd 最大。
牛妹不满足于只求出这个最大的 gcd\gcdgcd,所以她希望你还能帮她求出在满足 gcd\gcdgcd 最大时最小的 x。
输入描述:
第一行一个整数 n (2≤n≤106)n\ (2\le n\le 10^6)n (2≤n≤106),表示牛妹的序列长度。
第二行 n 个整数 a1,a2,…,an (−1018≤ai≤1018)a_1, a_2, \ldots , a_n\ (-10^{18}\le a_i\le 10^{18})a1,a2,…,an (−1018≤ai≤1018),表示牛妹的序列。
输入保证存在最大的 gcd\gcdgcd。
输出描述:
输出一行两个整数,分别表示最大的 gcd\gcdgcd 和满足 gcd\gcdgcd 最大时最小的 x。
示例1
输入
3
-3 1 3
输出
2 1
先进行排序,接着求出所有a[i]-a[1]的最大公约数,得出的值就是我们要求的最大公约数。接着求出x的值。
为什么要求出每个a[i]-a[1]的值呢,我们会发现,不论他们加上多少,它们的差值总是不变的,而他们差之间的最大公约数也就是我们要求的最大公约数,最后求出x的值也就简单了。
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll gcd(ll a,ll b) {
return b==0?a:gcd(b,a%b);
}
const int N=1e6+5;
ll a[N];
int main() {
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+1,a+1+n);
ll temp=0;
for(int i=2;i<=n;i++)
temp=gcd(temp,a[i]-a[1]);
if(temp<0)
temp=-temp;
cout<<temp<<" ";
if(a[1]>=0)
cout<<(temp-a[1])%temp<<endl;
else
cout<<abs(a[1]%temp)<<endl;
return 0;
}