Codeforces Round #320 (Div. 2) D. "Or" Game 数学

D. "Or" Game
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

You are given n numbers a1, a2, ..., an. You can perform at most k operations. For each operation you can multiply one of the numbers by x. We want to make Codeforces Round #320 (Div. 2)  D. "Or" Game  数学 as large as possible, where Codeforces Round #320 (Div. 2)  D. "Or" Game  数学 denotes the bitwise OR.

Find the maximum possible value of Codeforces Round #320 (Div. 2)  D. "Or" Game  数学 after performing at most k operations optimally.

Input

The first line contains three integers nk and x (1 ≤ n ≤ 200 000, 1 ≤ k ≤ 10, 2 ≤ x ≤ 8).

The second line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 109).

Output

Output the maximum value of a bitwise OR of sequence elements after performing operations.

Examples
input
3 1 2
1 1 1
output
3
input
4 2 3
1 2 4 8
output
79
Note

For the first sample, any possible choice of doing one operation will result the same three numbers 1, 1, 2 so the result is Codeforces Round #320 (Div. 2)  D. "Or" Game  数学.

For the second sample if we multiply 8 by 3 two times we'll get 72. In this case the numbers will become 1, 2, 4, 72 so the OR value will be 79 and is the largest possible result.

题意:给你n个数,可以在任意位置乘以k次x;

   求n个数最大的或值;

思路:首先显然尽量将最大的位置放1;所以尽量乘以大的数;

    将全部拆分成二进制,复杂度N*60

#include<bits/stdc++.h>
using namespace std;
#define ll __int64
#define mod 1000000007
#define esp 0.00000000001
const int N=2e5+,M=1e6+,inf=1e9;
ll a[N];
ll flag[N];
ll quickmul(ll x,ll y)
{
ll ans=;
while(y)
{
if(y&)
ans*=x;
x*=x;
y>>=;
}
return ans;
}
void update(ll x,ll gg)
{
int ji=;
while(x)
{
flag[ji++]+=(gg)*(x%);
x>>=;
}
}
ll getans()
{
ll base=,sum=;
for(int i=;i<=;i++)
{
if(flag[i])
sum+=base;
base*=;
}
return sum;
}
int main()
{
ll x,y,z,i,t;
scanf("%I64d%I64d%I64d",&x,&y,&z);
ll mul=quickmul(z,y);
for(i=;i<x;i++)
scanf("%I64d",&a[i]),update(a[i],);
ll ans=;
for(i=;i<x;i++)
{
update(a[i],-);
update(a[i]*mul,);
ans=max(ans,getans());
update(a[i]*mul,-);
update(a[i],);
}
printf("%I64d\n",ans);
return ;
}

上一篇:Java并发之AQS详解


下一篇:POJ1013Counterfeit Dollar