NC214945. 牛牛数数
描述
输入描述
第一行一个数字n, K
接下来一行n个数字,分别是。
输出描述
输出一个数字表示答案。
示例1
输入:
5 4 1 3 5 2 8
输出:
11
说明:
异或组合可得到的比K大的数有:5 6 7 8 9 11 10 13 12 14 15共有11个数,所以答案为11。C++(g++ 7.5.0) 解法, 执行用时: 68ms, 内存消耗: 456K, 提交时间: 2023-05-02 10:54:01
#include<iostream> #define ll long long using namespace std; ll p[64],d[64],n,k,cnt,zero,ans; ll add(ll x){ for(int i=62;i>=0;i--)if(x>>i&1){ if(d[i])x^=d[i]; else return d[i]=x; }return 0; } void build(){ for(int i=62;i>=0;i--)for(int j=i-1;j>=0;j--)if(d[i]>>j&1)d[i]^=d[j]; for(int i=0;i<=62;i++)if(d[i])p[cnt++]=d[i]; } ll ran(ll k,ll res=0){ for(int i=cnt-1;i>=0;i--)if(k>=p[i]){ res+=1ll<<i;k^=p[i]; }return res; } int main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n>>k;for(int i=1;i<=n;i++){ ll x;cin>>x;add(x); }build(); cout<<((1ll<<cnt)-1-ran(k)); }
C++(clang++11) 解法, 执行用时: 49ms, 内存消耗: 504K, 提交时间: 2021-01-15 22:54:10
#include<bits/stdc++.h> using namespace std; typedef long long ll; bool mark[65]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); ll n,k; cin>>n>>k; ll ans=0; for(int i=1;i<=n;i++) { ll x; cin>>x; for(int k=0;k<=63;k++) { ll tmp=1LL<<k; if(x&tmp) { if(!mark[k]) { ans+=tmp; mark[k]=1; } } } } cout<<ans-k; }