题目:http://codeforces.com/problemset/problem/578/B
题意:给定n、k、p,和n个数。你可以对某些或者某个数乘上一次或者少于k次的p(一个数可以乘多次,总共最多使用k次),求新数列‘|’起来的最大值。
分析:注意到起决定性作用的是二进制的最高位。假如选择了一个数*p,那么剩下的k-1次也应该用在这个数上。直接暴力枚举哪个数就行了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn = 2e5+6;
LL a[maxn],prefix[maxn],suffix[maxn];
int main()
{
LL n,K,p,i,j;
scanf("%lld%lld%lld",&n,&K,&p);
for(i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(i=1;i<=n;i++)
prefix[i]|=prefix[i-1]|a[i];
for(i=n;i>=1;i--)
suffix[i]|=suffix[i+1]|a[i];
LL xp=1,ans=0;
for(i=1;i<=K;i++)
xp*=p;
for(i=1;i<=n;i++)
ans=max(ans,prefix[i-1]|(a[i]*xp)|suffix[i+1]);
printf("%lld\n",ans);
return 0;
}