每日一题
有一组整数 {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到的全部遍历值为0,举0到7的例子:0与7,1与6,2与5,3与4异或,会发现它们的异或值全为7,即为,因为它们本身的个数是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;
}