# 2749. Minimum Operations to Make the Integer Zero ## 題目簡述 給你兩個數字 num1 、 num2, 接著 讓 num1 - (2的冪次方 + num2) 若干次,直到 num1 = 0,求若干次,若無法達成則回傳 -1 --- ## 思路 一開始還想要靠暴力,但是很明顯牽扯到數字的次方,一定會爆測資,加上題目求特定次數或是極值所以高機率是 DP ,但是這題也不用 DP ,也可以解 如果把 num1 - (2的冪次方 + num2) 若干次 可以整理成 num1 - k*num2 - k個2的冪次方和,所以前面是可以預先處理的,只要判斷該值是否是2的冪次方組合的值就好。 2的冪次方和的可以表示任何數(2的0次方是1,沒有數字不能由奇數、偶數組成),問題是幾個2的冪次方,數量不能超過k。 因此先求出 t = num1 - k * num2; 接著判斷 0 < t, k <= t,快速判斷一個數字是由幾個2的冪次方組合的方法,就是將數字轉換成2進制,數他有幾個1(ex 7 = bin(111), 4+2+1),c++甚至有提供函式 ``` __builtin_popcountll(); ``` 可以數2進制有幾個1,只要符合條件回傳答案即可 --- ## C++ 實作 ```cpp class Solution { public: int makeTheIntegerZero(long long int num1, long long int num2) { for(int i = 0; i <= 60; i++){ long long t = num1 - i * num2; if( t < 0) continue; unsigned long long u = (unsigned long long) t; if(__builtin_popcountll(u) <= i && i <= t ) return (int)i; } return -1; } }; ``` --- ## 關鍵點