公因子(C++)

題目描述

牛妹是一個喜歡公因子的女孩子。
定義 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章