列表

详情


NC214945. 牛牛数数

描述

牛牛手上有个数字,对于每个数字,还有一个数K,,从这n个数中任取任意个数异或(个数大于等于1,小于等于n),得到数字x,

问数字x有多少个是比K更大的,如果有多种组合异或得到x,x始终只算出现一次。

输入描述

第一行一个数字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;
}

上一题