Daimayuan Online Judge 简单的异或问题

每日一题

有一组整数 {0,1,2,…,2m−1}{0,1,2,…,2m−1}, 请从中选出 kk 个数,使得这 kk 个数的异或和为 nn, 请输出最大的满足条件的 kk。

输入格式

两个数 nn 和 mm, 其中 0≤0≤n≤2m−1,1≤m≤60≤2m−1,1≤m≤60。

输出格式

输出最大的满足条件的 kk。

样例输入

2 2

样例输出

3

样例解释

对于样例,我们可以选择 {0,1,3}{0,1,3}。

心情:好久也没有跟新博客了,又是在感情之中陷入了泥潭。也算是有一个了结吧。在每一次的情感之中,我不知道她的感受,我始终都清楚我是一个失败者。始终都是犹犹豫豫,优柔寡断,我想我下次不会了,我也不会在有下次了,我想我大学毕业之前也不会再去寻找对象,也不会去想了。在此做一个决定,做一个了解。

 

思路:在我之前写的一篇博客中提到从0异或到n中看除余4的结果来快速处理异或结果,但是确实那一篇的博客有较大的限制的范围,在这里重新规范(也算是扩充)一下大量数据的快速异或处理:首先要明白任何从0到2^{m}-1的全部遍历值为0,举0到7的例子:0与7,1与6,2与5,3与4异或,会发现它们的异或值全为7,即为2^{m}-1,因为它们本身的个数是2的次方数,并且也得是4的倍数(只要它们的次方数大于2,就一定会是4的倍数,因为这是次方,不断乘2而已),那么它们就一定能凑出偶数个两两组成得数对。只有一种情况凑不出也就是m=1时。现在明白这个道理之后继续将这个题得思路引申到这个结论之中:假设我们现在想要得到0从7中想要得到3,那么一共会有4个数对,其中的两个我们可以舍去,因为它们异或为0,假如现在剩下2与5,3 与4,第一个数对得值是7,谁异或7得3呢?还有一个公式是a^b=c 与 a^c=b 是等价的,这时3与4得7,是不是就是7^4=3,那么现在就会明白当全部个数大于等于4时,只要从全部数对中取掉一个数就能得到我们想要的数。然后在对个数不足4时进行特判即可。

完整代码:

#include <bits/stdc++.h>

using namespace std;

#define int long long
const int mod=1e9+7;



signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n,m;
    cin>>n>>m;
    int res=1;
    res<<=m;
    if(n==0&&m==1)
    {
        cout<<"1"<<endl;
    }
    else if(n==0)
    {
        cout<<res<<endl;
    }
    else if(n==1&&m==1)
    {
        cout<<"2"<<endl;
    }
    else
    {
        cout<<res-1<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值