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