51nod Or 和 Sum 位運算

2021-10-18 06:41:18 字數 1477 閱讀 6856

傳送門:

給定兩個非負整數 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 表示有幾個貨物。第二行...