### 672. Bulb Switcher II

题目:
<https://leetcode.com/problems/Bulb-Switcher-II/>


难度:

Medium


思路

这道题又是一个数学题。找规律呀找规律。
我们只需要考虑当 n<=2 and m < 3 的特殊情形。因为当 n >2 and m >=3, 结果肯定是 8.
The four buttons:

- Flip all the lights.
- Flip lights with even numbers.
- Flip lights with odd numbers.
- Flip lights with (3k + 1) numbers, k = 0, 1, 2, ...

如果我们使用了 button 1 和 2, 其效果等同于使用 button 3 。
类似的..

- 1 + 2 --> 3
- 1 + 3 --> 2
- 2 + 3 --> 1

所以，只有 8 种情形。

***灯全亮, 操作1, 操作2, 操作3, 操作4, 操作1+4, 操作2+4, 操作3+4***

并且当 n>2 and m>=3 时，我们就能够获得所有的情形。

| m\n  | 0  | 1  | 2  | 3 | 4 |
 ---   |----|--- |----|---|---|
| 0    | 1  | 1  | 1  | 1 | 1 |
| 1    | 1  | 2  | 3  | 4 | 4 |
| 2    | 1  | 2  | 4  | 7 | 7 |
| 3    | 1  | 2  | 3  | 8 | 8 |

```python
class Solution(object):
    def flipLights(self, n, m):
        """
        :type n: int
        :type m: int
        :rtype: int
        """
        if m * n == 0: return 1
        if n == 1: return 2
        if n == 2: return 4 - (m % 2)
        if m == 1: return 4
        if m == 2: return 7
        return 8
```

还有两位大佬的两行解法：
```python
class Solution(object):
    def flipLights(self, n, m):
        m, n = min(3, m), min(3, n)
        return 1 if n * m == 0 else self.flipLights(n - 1,  m) + self.flipLights( n - 1, m - 1) 
```
```python
class Solution(object):
    def flipLights(self, n, m):
        n = min(n, 3)
        return min(1<<n, 1+m*n)

```


