c++代码如下:
#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i = x ; i <= y ;++ i)
#define repd(i,x,y) for(register int i = x ; i >= y ;-- i)
typedef long long ll;
using namespace std;
template<typename T>inline void read(T&x)
{
x = 0;char c; int sign = 1;
do { c = getchar(); if(c == '-') sign = 1; }while(!isdigit(c));
do { x = x * 10 + c - '0'; c = getchar(); }while(isdigit(c));
x *= sign;
}
const int N = 2e5+50;
int n;ll a[N],b[N];
inline bool check(int s,ll p)
{
ll k = 1;
rep(i,s,n) { b[i] = k; k = k * 2 % p; }
sort(b + s,b + 1 + n);
rep(i,s,n) if(::a[i] != b[i]) return false;
return true;
}
ll solve(int s)
{
bool ok = 1;
rep(i,s + 1,n) if(a[i] & 1) ok = 0;
if(ok)
{
++s;
rep(i,s,n) a[i] /= 2;
return solve(s) << 1;
}
ll p1 = 0,p2 = 0,p3 = 0;
rep(i,s,n)
{
if(a[i]&1) p3 = max(a[i],p3);
else if(a[i] > p1)
{
p2 = p1;
p1 = a[i];
}else if (a[i] > p2) p2 = a[i];
}
if(check(s,p2*2 - p3)) return p2*2 - p3;
else return p1*2 - p3;
}
int main()
{
freopen("pow9.in","r",stdin);
freopen("pow9.out","w",stdout);
read(n);
rep(i,1,n) read(a[i]);
sort(a + 1,a + 1 + n);
if(a[1] == 0)
{
printf("%lld\n",a[n]?a[n]<<1:1);
return 0;
}
rep(i,2,n)
if(a[i] != (a[i-1]<<1)) break;
else if(i == n)
{
printf("%lld\n",a[n] + 1);
return 0;
}
printf("%lld",solve(1));
return 0;
}