传送门

先说结论的做法

差分数组的和原数组相同

因为设原数组的啊

那么每个数都是的倍数,每个数减去一个的倍数仍然不会改变整体的

那么数组的每个数加上,差分数组只有第一个数会加上去

也就是差分数组的就是最大的,这样就非常简单


但是我太傻了,开始没想到这个结论^_^

加上一个使得所有数字的最大,设最大的

那么首先所有数模的意义下都是相同的,否则加上也不会改变余数

设最小数是,次小数是(已经去除了重复数字)

那么答案不可能比大,这样的话最小的两个数是不同余的

所以如果答案落在之间,要求,此时是同余的

拿去检验一下即可

否则,考虑答案落在之中

由于要求的意义下相等,必然有的倍数

这样枚举的因子即可去检验即可

然后发现,也只是这个的一种特殊情况罢了

先说结论的做法

差分数组的和原数组相同

因为设原数组的啊

那么每个数都是的倍数,每个数减去一个的倍数仍然不会改变整体的

那么数组的每个数加上,差分数组只有第一个数会加上去

也就是差分数组的就是最大的,这样就非常简单


#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
int n,a[maxn],mi=1e9,ci=1e9,k,res=1;
void isok(int ans)
{
    if( ans<=res )    return;
    int now = a[1]%ans;
    for(int i=1;i<=n;i++)
        if( a[i]%ans!=now )    return;
    if( ans>res )    res = ans,k = ans-now;
    return;
}
void print(){ cout << res << " " << k; exit(0); }
int main()
{
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        cin >> a[i];
        if( a[i]<mi )    ci = mi, mi = a[i];
        else if( a[i]>mi&&a[i]<ci )    ci = a[i];
    }
    int x = ci-mi;
    for(int i=1;i*i<=x;i++)
    {
        if( x%i!=0 )    continue;
        isok(i); isok(x/i);
    }
    print();
}