思路:
(1)问题分两步,一是确定M,二是检验是否合法。
(2)对于确定M,分为M等于1与不等于1两种情况;
- 若M == 1,那么每个值均为0,进行判断即可;
- M != 1,那么M的出现可能在开头,可能在中间,也可能永远不出现;
(3)对于在开头,由于M大于1,故第一个值必为1,否则判错;
(4)对于在中间,如果a[i + 1] != a[i]*2,说明M出现了,直接令M = 2*a[i] - a[i + 1];
对于每个a[i + 1]如果2*a[i]模这个M!=a[i + 1]则失败,否则M合法;
(5)对于永远不出现,M默认为-1,若永远不出现,M直接打印即可。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[100010];
void solve()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
//第一种情况a[1]=0
if(a[1]==0)
{
for(int i=2;i<=n;i++)
{
if(a[i]>0)
{
printf("-1\n");
return;
}
}
printf("1\n");
return;
}
if(a[1]!=1)
{
printf("-1\n");
return;
}
int m=-1;
for(int i=1;i<n;i++)
{
if(m==-1&&a[i]*2!=a[i+1]) m=a[i]*2-a[i+1];
if(m!=-1&&a[i]*2%m!=a[i+1])
{
printf("-1\n");
return;
}
}
printf("%d\n",m);
}
int main()
{
int t;
scanf("%d",&t);
while(t--) solve();
return 0;
}