思路(特殊条件切入):
看到加相同数——>等差数列 (1)
看到取模——>+n*mod (2)
由(1)(2)知数列每一项加上一个n*mod,构成等差数列 ——>差值
1、差值为正
(1)没有>mod,则此为c
(2)取过mod,则c为 a+n*mod,可知mod可取无穷大
2、差值为负
一定取过mod,且差值为c-n*mod,由于要找最大的mod,故取差值为c-mod,不影响数列合法性
分类讨论:
一、差值不同,为正
由1知两种情况都没有确定的c值,故不可能
二、差值不同,为负
由2知没有确定的c值,故不可能
三、差值全相同,为正:
由1(2)可知mod可能为为无穷
四、差值全相同,为负:
由于c和mod两个变量不定,故可能为无穷
五、一正一负
2知差值为c-mod,1知差值为c,故c-(c-mod)即为最大的mod值(最大的条件由负差值决定)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,a,ans,ansl,T;
int i,j,k,l,x,y,cha[100005],maxx;
int main()
{
scanf("%lld",&T);
while(T--)
{
scanf("%d",&n);
scanf("%d",&x);
maxx=x;
for(i=2;i<=n;i++)
{
scanf("%d",&y);
cha[i]=y-x;
x=y;
if(x>maxx)maxx=x;
}
if(n<=2)
{
printf("0\n");
}else
{
bool keyi=true;
x=2000000005;
y=2000000005;
for(i=2;i<=n;i++)
{
if(x==2000000005)x=cha[i];
else
{
if(x!=cha[i])
{
if(y==2000000005)y=cha[i];
else
{
if(y!=cha[i])keyi=false;
}
}
}
}
if(keyi==false)
{
printf("-1\n");
}else if(y==2000000005)
{
printf("0\n");
}else
{ if((x<=0&&y<=0)||(x>=0&&y>=0)||(x==0&&y!=2000000005)||((y==0&&x!=2000000005)))printf("-1\n");
else{
int ans;
if(x<0){
ans=y-x;
x=y;
}else{
ans=x-y;
}
if(ans<maxx)printf("-1\n");
else printf("%d %d\n",ans,x);
}
}
}
}
}