牛客练习赛 66C公因子 题解

原题

原题

思路

考场想复杂了,搞到自闭……
实际上,因为差值不变,我们可以先差分,求\(\gcd\),便得到答案(考场时想多了,想到了负数、正数各种复杂的处理,但是不需要),最后处理一下即可

代码

#include <cstdio>
#include <cmath>
#include <algorithm>

#define ll long long

const int MAXN = 1e6+10;

ll n,a[MAXN],ji[MAXN];

ll gcd(ll x,ll y){
    if(x < y) std::swap(x,y);
    if(y == 0) return x;
    return gcd(y,x % y);
}

int main(){
    scanf("%lld",&n);
    for(int i = 1;i <= n;i++){
        scanf("%lld",&a[i]);
        ji[i]=abs( a[i] - a[i-1]);
    }
    ll i,ans;
    for(i = 2;i <= n;i++) if(ji[i] > 0) break;
    ans=ji[i];
    for(;i <= n;i++){
        ans = gcd(ans,ji[i]);
    }
    ans = abs(ans);
    printf("%lld %lld",ans,(ans - a[1] % ans)%ans);
    return 0;
}
posted @ 2020-06-27 08:49  Werner_Yin  阅读(138)  评论(0编辑  收藏  举报