題目描述
牛妹是一個喜歡公因子的女孩子。
定義 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;
}