傳送門:
給定兩個非負整數 pairor,pairsum,
問是否存在a,b,使得a|b=pairor,a+b=pairsum。
這道題需要有乙個前置知識,不然很難做:
( a+
b)−(
a∣b)
=(a&
b)(a+b)-(a|b)=(a\&b)
(a+b)−
(a∣b
)=(a
&b)
我們設(a+
b)=x
,(a∣
b)=y
,(a&
b)=z
,(a+b)=x,(a|b)=y,(a\&b)=z,
(a+b)=
x,(a
∣b)=
y,(a
&b)=
z,那麼有x−y
=zx-y=z
x−y=
z,題目已知x,y
x,yx,
y --------------------------------------------①
這道題我們可以推出以下結論,那就是:
y
yy和z
zz的與運算是恆等於z
zz的,即y&z
==zy\&z==z
y&z==z
---------------------------------②
滿足式子①②,就說明是存在a,b的,輸出possible,否則impossible
分析一下:
假設z的某一位為1,對於這一位的運算,
∵z=(a&b) =1
∴a和b的對應位都為1,那麼可以得到 y=(a|b)=1
y &z
==zy\&z==z
y&z==z
是成立的
假設z的某一位為0,對於這一位的運算,
∵z=(a&b) =0
∴a和b至少一位不為1,不管y=(a|b)取何值
y &z
==zy\&z==z
y&z==z
也是成立的
二進位制運算一定要加括號! 二進位制運算一定要加括號! 二進位制運算一定要加括號!
((pairor&pairand)==pairand)我寫成了
(pairor&pairand==pairand)
wa了三次沒找出來問題,哭了/(ㄒoㄒ)/~~
#include
using namespace std;
typedef
long
long ll;
ll pairor,pairsum;
intmain()
位運算子和位運算
一 按位與 運算子 1 運算規則 參加運算的兩個 資料,按二進位進行 與 運算,如果兩個相應的二進位都為1,則該位的結果值為1,否則為0,即 0 0 0,0 1 0,1 0 0,1 1 1.2 用途 1 清零 運算物件 原來的數中為1的位,新數中相應位為0。2 取乙個數中某些指定位。如想要取乙個整數...
位運算和位移運算
按位與 按位或 按位取反 按位異或 左移 a 左移b位,最低位空出來的b位用0補齊 結果 位移數b作為2的冪次與運算元a相乘。帶符號右移 a b 將二進位制形式的a逐位右移b位,最高位空出來的b位用符號位補齊 結果 運算元a除以位移數b的2次冪 無符號右移 a b 將二進位制形式的a逐位右移b位,最...
51nod1596模擬位運算
1 秒131,072 kb 10 分 2 級題 現在有n個貨物,第i個貨物的重量是 2wi2wi 每次搬的時候要求貨物重量的總和是乙個2的冪。問最少要搬幾次能把所有的貨物搬完。樣例解釋 1,1,2作為一組。3,3作為一組。收起單組測試資料。第一行有乙個整數n 1 n 10 6 表示有幾個貨物。第二行...