Ridhiman challenged Ashish to find the maximum valued subsequence of an array a of size n consisting of positive integers.
The value of a non-empty subsequence of k elements of a is defined as ∑2i over all integers i≥0 such that at least max(1,k−2) elements of the subsequence have the i-th bit set in their binary representation (value x has the i-th bit set in its binary representation if ⌊x2i⌋mod2 is equal to 1).
Recall that b is a subsequence of a, if b can be obtained by deleting some(possibly zero) elements from a.
Help Ashish find the maximum value he can get by choosing some subsequence of a.
Input
The first line of the input consists of a single integer n (1≤n≤500) — the size of a.
The next line consists of n space-separated integers — the elements of the array (1≤ai≤1018).
Output
Print a single integer — the maximum value Ashish can get by choosing some subsequence of a.
Examples
Input
3
2 1 3
Output
3
Input
3
3 1 4
Output
7
Input
1
1
Output
1
Input
4
7 7 1 1
Output
7
Note
For the first test case, Ashish can pick the subsequence {2,3} of size 2. The binary representation of 2 is 10 and that of 3 is 11. Since max(k−2,1) is equal to 1, the value of the subsequence is 20+21 (both 2 and 3 have 1-st bit set in their binary representation and 3 has 0-th bit set in its binary representation). Note that he could also pick the subsequence {3} or {2,1,3}.
For the second test case, Ashish can pick the subsequence {3,4} with value 7.
For the third test case, Ashish can pick the subsequence {1} with value 1.
For the fourth test case, Ashish can pick the subsequence {7,7} with value 7.
思路:对于n<3的数组来说,我们可以直接暴力求出来。
对于n>=3的数组,我们选择k==3的时候,一定是最优的。因为max(3-2,1)==1.如果原来选择的3个数,第i位有1个1,但是呢,加进来的这个数字,第i个不为0,这样的话,加进来的这个数,不仅没有贡献,还会拉低价值。比4更高的也是一样。
代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxx=5e2+10;
ll a[maxx];
int num[maxx];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
ll ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,a[i]);
for(int j=i+1;j<=n;j++)
{
ans=max(ans,a[i]|a[j]);
for(int k=j+1;k<=n;k++) ans=max(ans,a[i]|a[j]|a[k]);
}
}
cout<<ans<<endl;
return 0;
}
努力加油a啊,(o)/~