码迷,mamicode.com
首页 > 其他好文 > 详细

CF627A Xor Equation

时间:2018-04-11 15:44:34      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:typedef   can   puts   pac   两种   names   异或   name   有序   

题意:a+b=s,a^b=x(异或)。问有多少有序Z+对(a,b)满足条件。

 

标程:

 1 #include<cstdio>
 2 using namespace std;
 3 typedef long long ll;
 4 ll s,x,cnt,t,fl;
 5 int main()
 6 {
 7     scanf("%lld%lld",&s,&x);
 8     t=(s-x)/2;
 9     if ((t&x)||t<0||((s-x)&1)) return puts("0"),0;
10     if (!t) fl=-2;//减掉为0的两组(a,0),(0,b)
11     for (int i=0;i<=40;i++)
12       if (x&(1ll<<i)) cnt++;
13     printf("%lld\n",(1ll<<cnt)+fl); 
14    return 0;
15 }

 

题解:数学

由对称差的思路(a|b)-(a&b)=a^b.

得(a+b)-2(a&b)=a^b.先判一波合法性。

a&b=1 a^b=0  1种

a&b=0 a^b=0  1种(以上两种都有一一对应的关系)

a&b=0 a^b=1  2种

a&b=1 a^b=1  被判掉,不存在

所以只用统计a^b中有多少个1,2^个数就是答案。

注意当s==x时,a&b=0,会有a=0或b=0的情况,要减去,因为a,b∈Z+。

CF627A Xor Equation

标签:typedef   can   puts   pac   两种   names   异或   name   有序   

原文地址:https://www.cnblogs.com/Scx117/p/8794821.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!