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