思路:
(1)问题分两步,一是确定M,二是检验是否合法。
(2)对于确定M,分为M等于1与不等于1两种情况;
(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
-
- 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
- {
- 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;
- }