Codeforces - 1225C 二進制位的應用

<Codeforces - 1225C> 二進制位的應用

http://codeforces.com/contest/1225/problem/C

題意:

給定n,p,求滿足n = (2^a1 + p) + (2^a2 + p) + (2^a3 + p) + ... + (2^ak + p)的最小的k值(a1 ~ ak可以有相等的值)。

例如,n = 24,p = -1,此時k = 4。因爲24 = (2^4 - 1) + (2^2 - 1) + (2^2 - 1) + (2^2 - 1),共能拆成4項。

思路:

依題有num = n - kp = 2^a1 + 2^a2 + 2^a3 + ... + 2^ak。如果n - kp爲負顯然不符合題意,打印-1。枚舉k,記num二進制位中1的個數爲cnt,宏定義lowbit爲x & -x,lowbit的作用是返回最低位的1以及它後面若干個零,所以函數dig_cnt()就返回了二進制位中1的個數,用1<<bit二進制枚舉也可以。如果當前k的值 < cnt,那必然沒法滿足題意,打印-1。因爲a1~ak可以有重複的值,所以k未必正好等於cnt,k可以大於cnt,而且只要當前枚舉到的k,小於等於num本身就必然滿足條件,因爲k > num的話,num最多拆成num個2^0,所以就不滿足題意了,只要k<=num,就一定能拆成合法的幾個2的次冪。

AC代碼:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章