首先应该保证二进制最高位尽量高,而位数最高的数乘x以后位数任然是最高的,所以一定一个数是连续k次乘x。
当出现多个最高位的相同的数就枚举一下,先预处理一下前缀后缀即可。
#include<bits/stdc++.h> using namespace std; const int maxn = 2e5+5; int a[maxn]; int pf[maxn],sf[maxn]; int main() { int n,k,x; scanf("%d%d%d",&n,&k,&x); for(int i = 1; i <= n; i++){ scanf("%d",a+i); pf[i] = pf[i-1]|a[i]; } for(int i = n; i >= 1; i--){ sf[i] = sf[i+1]|a[i]; } long long ans = pf[n]; for(int i = 1; i <= n; i++){ long long t = a[i]; int ct = k; while(ct--) t *= x; ans = max(ans,t|pf[i-1]|sf[i+1]); } printf("%I64d",ans); return 0; }