# 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;
}
};
```
---
## 關鍵點