先说结论的做法
差分数组的和原数组相同
因为设原数组的啊为
那么每个数都是的倍数,每个数减去一个
的倍数仍然不会改变整体的
那么数组的每个数加上,差分数组只有第一个数会加上去
也就是差分数组的的
就是最大的
,这样就非常简单
但是我太傻了,开始没想到这个结论^_^
加上一个使得所有数字的
最大,设最大的
为
那么首先所有数模的意义下都是相同的,否则加上
也不会改变余数
设最小数是,次小数是
(已经去除了重复数字)
那么答案不可能比大,这样的话最小的两个数是不同余的
所以如果答案落在之间,要求
,此时
取
是同余的
拿去检验一下即可
否则,考虑答案落在之中
由于要求模
的意义下相等,必然有
是
的倍数
这样枚举的因子即可去检验即可
然后发现,取
也只是这个的一种特殊情况罢了
先说结论的做法
差分数组的和原数组相同
因为设原数组的啊为
那么每个数都是的倍数,每个数减去一个
的倍数仍然不会改变整体的
那么数组的每个数加上,差分数组只有第一个数会加上去
也就是差分数组的的
就是最大的
,这样就非常简单
#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();
} 
京公网安备 11010502036488号