题目大意:给出n,k,x及n个数,可以对n个数中的某些数进行总共k次乘以x的操作,求最大的结果
解题思路:将k次操作乘到某个数上会使得结果最大,因为2<=x<=8;每次操作总会使得至少左移一位,再枚举最大值即可,注意最大值可能超int范围
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+100;
__int64 a[maxn],l[maxn],r[maxn];
int main()
{
int n,k,x;
while(~scanf("%d%d%d",&n,&k,&x))
{
for(int i = 1; i <= n; i++)
scanf("%I64d",&a[i]);
l[0] = 0;
for(int i = 1; i <= n; i++)
l[i] = l[i-1]|a[i];
r[n+1] = 0;
for(int i = n; i >= 1; i--)
r[i] = r[i+1]|a[i];
int tmp = 1;
for(int i = 0; i < k; i++)
tmp *= x;
//printf("%d\n",tmp);
__int64 maxx = -1;
for(int i = 1; i <= n; i++)
{
maxx = max(maxx,l[i-1]|a[i]*tmp|r[i+1]);
}
printf("%I64d\n",maxx);
}
return 0;
}