#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int M=33;
ll a[100010],b[23],c[23],cnt;
int A[40];
int k,n,m;
inline void Solve1(){
ll t=0;
for(int i=1;i<=n;i++)t|=a[i];
cout<<(t>>1);
if(t&1)puts(".5");
}
inline bool Check(int x){
ll t=1ll<<x;
for(int i=1;i<=n;i++)
if((a[i]&t))return 1;
return 0;
}
inline void Solve2(){
ll Ans=0,Res=0;
for(int i=M-1;i>=0;i--)
if(Check(i))
for(int j=M-1;j>=0;j--)
if(Check(j)){
ll t1=1ll<<i,t2=1ll<<j;
int t=i+j-1;
for(int k=1;k<=n;k++)
if(((a[k]&t1)>0)!=((a[k]&t2)>0)){
t--;
break;
}
if(t<0)Res++;else Ans+=1ll<<t;
}
cout<<Ans+(Res>>1);
if(Res&1)puts(".5");
}
inline void Solve3(){
for(int i=1;i<=n;i++)
for(int j=22;j>=0;j--)
if((a[i]&(1<<j))){
if(!b[j]){
b[j]=a[i];
c[++cnt]=b[j];
break;
}
a[i]^=b[j];
}
ll Ans=0,Res=0;
for(int i=0;i<(1<<cnt);i++){
ll t=0;
for(int j=0;j<cnt;j++)
if((i&(1<<j)))t^=c[j+1];
ll x=0,y=1;
for(int j=1;j<=k;j++){
x*=t;y*=t;
x+=y>>cnt;y&=(1<<cnt)-1;
}
Res+=y;
Ans+=x+(Res>>cnt);
Res&=(1<<cnt)-1;
}
cout<<Ans;
if(Res){
double T=(double)Res/(1<<cnt);
T*=1e7;
ll n=T;
int l=0;
while(n)A[++l]=n%10,n/=10;
int L=1;
while(!A[L])L++;
putchar('.');
for(int i=7;i>=L;i--)printf("%d",A[i]);
}
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)scanf("%llu",&a[i]);
if(k==1)Solve1();else
if(k==2)Solve2();else Solve3();
return 0;
}
[ 线性基 ] BZOJ3811
最新推荐文章于 2023-02-16 20:50:27 发布