思路:
这个题搞清楚那几种情况,特判一下第一个数,需要注意的是不能简单直接的按照题意使用
pow(2,n - 1),这样会wa,因为n是1e5的数量级。这里要用一个规律,即2^(n - 1) 的序列的规律是 前一项 * 2 = 后一项,则2^(n - 1) mod M之后,其规律没有变,依然是 前一项 * 2 = 后一项
代码:
#include<iostream>
#include<cstring>
#include<vector>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
int tmp[100010];
int x = 1;
int t;
bool flag, flag1;
int main() {
scanf("%d", &t);
int n;
while(t --) {
scanf("%d", &n);
flag = false, flag1 = false, x = 1;
for(int i = 1; i <= n; i ++)
scanf("%d", &tmp[i]);
if(tmp[1] == 0) {
for(int i = 1; i <= n; i ++) {
if(tmp[i] != 0) {
flag = true;
break;
}
}
}
else if(tmp[1] > 1) flag = true;
else {
for(int i = 2; i <= n; i ++) {
if(tmp[i - 1] * 2 != tmp[i]) {
x = tmp[i - 1] * 2 - tmp[i];
flag1 = true;
break;
}
}
if(flag1) {
for(int i = 2; i <= n; i ++) {
if(tmp[i - 1] * 2 % x != tmp[i]) {
flag = true;
break;
}
}
} else
flag = true;
}
if(!flag) printf("%d\n", x);
else printf("-1\n");
}
return 0;
}