杭州电子科技大学计算机学院大学生程序设计竞赛(2015'12)Bitwise Equations (二进制)

刚开始这道题,想有什么优化的方法结果然并卵。。。想了一下二进制,但是是看的规律也没有发现什么- -。

之后才知道,如果满足X+Y=X|Y。必须是在X的二进制位置为0上对应的Y的二进制的位置上 必须为1。才会满足此公式

如果二进制位置上同时为1的话,必然不会满足此公式。所以先统计X上的每位数字提取出来。同样的方法将K二进制数也分离。那么在X 中为0的位置插入k的值即可,所以到最后直接统计最后C数组中的数值即可。


#include <iostream>
#include<cstdio>
#define LL __int64
int a[100],b[100],c[100];
using namespace std;
int cnt;
int main()
{
    int n,m,cla,i,j;
    scanf("%d",&cla);
    int k;
    while(cla--)
    {
        scanf("%d%d",&n,&m);
        int s1,s2,z;
        s1=s2=0;z=0;
        while(n)
        {
            a[s1++]=n&1;
            n>>=1;
        }
        while(m)
        {
            b[s2++]=m&1;
            m>>=1;
        }
        j=0;
        for(i=0;i<s1;i++)
        {
            if(!a[i])
            {
                c[z++]=b[j++];
            }
            else
                c[z++]=0;
            if(j>=s2)break;
        }
        while(j<s2)
            c[z++]=b[j++];
        LL t=1,ans=0;
        for(i=0;i<z;i++)
        {
            if(c[i])
                ans+=t;
            t<<=1;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(二进制)