51Nod 1315 合法整數集 位運算

2021-09-30 19:47:15 字數 1260 閱讀 3566

題目

乙個整數集合s是合法的,指s的任意子集subs有fun(subs)!=x,其中x是乙個固定整數,fun(a)的定義如下:a為乙個整數集合,設a中有n個元素,分別為a0,a1,a2,...,an-1,那麼定義:fun(a)=a0 or a1 or ... or an-1;fun({}) = 0,即空集的函式值為0.其中,or為或操作。現在給你乙個集合y與整數x的值,問在集合y至少刪除多少個元素能使集合y合法?例如:y = ,x=7;顯然現在的y不合法,因為 1 or 2 or 4 = 7,但是刪除掉任何乙個元素後y將合法。所以,答案是1.

輸入

第一行兩個整數n,x,其中n為y集合元素個數,x如題所述,且1<=n<=50,1<=x<=1,000,000,000.之後n行,每行乙個整數yi,即集合y中的第i個元素,且1<=yi<=1,000,000,000.

輸出

乙個整數,表示最少刪除多少個元素。

樣例輸入

5 712

478

樣例輸出

2
分析

設x=a1 | a2 |……| an。|是或運算符號。那麼任意乙個ai不可能在x為0的二進位制位處為1,一旦存在這樣的ai,它們的或運算值一定不等於x。它們是不必刪除的,因為一旦使用它們,其值一定不等於x。該如何識別出這類數呢?看看這個條件 (x|ai)>x,如果ai的某個二進位制位為1而x對應的二進位制位為0,那麼ai就是此類數。通過這種方法標記這類數,不用去考慮它們。除了這一類數,剩下的都是由x的某些為1的二進位制位變為0形成的,現在就要統計x為1的二進位制位有多少數可以提供,例如1、2、4,8,x=7,8是不必刪除的數,不用考慮,1,2,4,7的二進位制分別為001、010、001和111。遍歷x的各個為1的二進位制位,統計對應二進位制位也為1的數的個數,最少個數就是答案,統計結果為111,因此答案為1。具體看程式

c++程式

#includeusing namespace std;

const int n=60;

int a[n];

bool flag[n];

int main()

if(numans=num;

}printf("%d\n",ans);

return 0;

}

51nod 1315 合法整數集

乙個整數集合s是合法的,指s的任意子集subs有fun subs x,其中x是乙個固定整數,fun a 的定義如下 a為乙個整數集合,設a中有n個元素,分別為a0,a1,a2,an 1,那麼定義 fun a a0 or a1 or or an 1 fun 0,即空集的函式值為0.其中,or為或操作。...

51nod 1315 合法整數集

先從數字中去掉與x進行或運算結果不為x的數字,因為這樣的數字肯定在x的某些個為0的位置上數值為1,無論如何也是去不掉的。然後計算出x的二進位制位哪些位置為1,然後從剩下那堆數字中計算x為1的位置那些數字在相應位置也為1的數字的個數。比如x二進位制位的第二位為1,就計算出那些數字中有幾個數字第二位為1...

51Nod 1315 合法整數集

乙個整數集合s是合法的,指s的任意子集subs有fun subs x,其中x是乙個固定整數,fun a 的定義如下 a為乙個整數集合,設a中有n個元素,分別為a0,a1,a2,an 1,那麼定義 fun a a0 or a1 or or an 1 fun 0,即空集的函式值為0.其中,or為或操作。...