CF1064B 【Equations of Mathematical Magic】

传送门

  题目意思就是给定a,求a−(a⊕x)−x=0 这个方程的解的个数。

  首先可以对这个方程变形可以得到a-x=a⊕x.相当于是a和x之间的相减得到的值和a异或x的值相等,即2种操作等效。

  因为x>=0,a>=0,所以a⊕x>=0,因此a-x>=0,即a>=x,综合得a>=x>=0。然后把a和x都变成2进制形式来考虑,当ai==0,xi==1的话

  ai^xi==1,而ai-xi==-1,可知这种情况下对第i位数字而言异或操作和相减操作是不等效的,在这种情况下不管x的其他位取什么,

  都有a-x!=a⊕x,即方程不可能成立,不存在解,由此可得ai==0时,对应的xi不能取1,类似的我们可以知道1.ai==0时,xi只可以

  取0。2.ai==1时,xi可以取0或者取1。也就是x的每个二进制位取值,按照以上2种规则,x才是方程的解,x的个数就是2的cnt次方,cnt即是a对应的二进制里1的个数。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int ans,t,a;
    scanf("%d",&t);
    while(t--)
    {
        ans=1;
        scanf("%d",&a);
        while(a)
        {
            if(a&1)
                ans*=2;
            a=a>>1;
        }
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/eason9906/p/11754841.html