###### tags: `957 Prison Cells After N Days` # 957 Prison Cells After N Days 筆記 ## 題目: There are `8` prison cells in a row and each cell is either occupied or vacant. Each day, whether the cell is occupied or vacant changes according to the following rules: - If a cell has two adjacent neighbors that are both occupied or both vacant, then the cell becomes occupied. - Otherwise, it becomes vacant. **Note** that because the prison is a row, the first and the last cells in the row can't have two adjacent neighbors. You are given an integer array `cells` where `cells[i] == 1` if the `ith` cell is occupied and `cells[i] == 0` if the `ith` cell is vacant, and you are given an integer `n`. Return the state of the prison after `n` days (i.e., `n` such changes described above). **Constraints:** - `cells.length == 8` - `cells[i]` is either `0` or `1`. - $1 <= n <= 10^9$ Example 1: ``` Input: cells = [0,1,0,1,1,0,0,1], n = 7 Output: [0,0,1,1,0,0,0,0] Explanation: The following table summarizes the state of the prison on each day: Day 0: [0, 1, 0, 1, 1, 0, 0, 1] Day 1: [0, 1, 1, 0, 0, 0, 0, 0] Day 2: [0, 0, 0, 0, 1, 1, 1, 0] Day 3: [0, 1, 1, 0, 0, 1, 0, 0] Day 4: [0, 0, 0, 0, 0, 1, 0, 0] Day 5: [0, 1, 1, 1, 0, 1, 0, 0] Day 6: [0, 0, 1, 0, 1, 1, 0, 0] Day 7: [0, 0, 1, 1, 0, 0, 0, 0] ``` Example 2: ``` Input: cells = [1,0,0,1,0,0,1,0], n = 7 Output: [0,0,1,1,1,1,1,0] Explanation: The following table summarizes the state of the prison on each day: Days 0: [1, 0, 0, 1, 0, 0, 1, 0] Days 1: [0, 0, 0, 1, 0, 0, 1, 0] Days 2: [0, 1, 0, 1, 0, 0, 1, 0] Days 3: [0, 1, 1, 1, 0, 0, 1, 0] Days 4: [0, 0, 1, 0, 0, 0, 1, 0] Days 5: [0, 0, 1, 0, 1, 0, 1, 0] Days 6: [0, 0, 1, 1, 1, 1, 1, 0] Days 7: [0, 0, 0, 1, 1, 1, 0, 0] ``` ## 觀察: Day 2, 4 ,6 的 index 1, 3, 5 會是一樣的 Day 1, 3, 5, 7 的 index 2, 4, 6 會是一樣的 但是到了 Example 2 就不適用了,試著把 n 拉大一點試試看 ``` Input: cells = [0,1,0,1,1,0,0,1], n = 30 Days 00: [0, 1, 0, 1, 1, 0, 0, 1] Days 01: [0, 1, 1, 0, 0, 0, 0, 0] Days 02: [0, 0, 0, 0, 1, 1, 1, 0] Days 03: [0, 1, 1, 0, 0, 1, 0, 0] Days 04: [0, 0, 0, 0, 0, 1, 0, 0] Days 05: [0, 1, 1, 1, 0, 1, 0, 0] Days 06: [0, 0, 1, 0, 1, 1, 0, 0] Days 07: [0, 0, 1, 1, 0, 0, 0, 0] Days 08: [0, 0, 0, 0, 0, 1, 1, 0] Days 09: [0, 1, 1, 1, 0, 0, 0, 0] Days 10: [0, 0, 1, 0, 0, 1, 1, 0] Days 11: [0, 0, 1, 0, 0, 0, 0, 0] Days 12: [0, 0, 1, 0, 1, 1, 1, 0] Days 13: [0, 0, 1, 1, 0, 1, 0, 0] Days 14: [0, 0, 0, 0, 1, 1, 0, 0] Days 15: [0, 1, 1, 0, 0, 0, 0, 0] Days 16: [0, 0, 0, 0, 1, 1, 1, 0] Days 17: [0, 1, 1, 0, 0, 1, 0, 0] Days 18: [0, 0, 0, 0, 0, 1, 0, 0] Days 19: [0, 1, 1, 1, 0, 1, 0, 0] Days 20: [0, 0, 1, 0, 1, 1, 0, 0] Days 21: [0, 0, 1, 1, 0, 0, 0, 0] Days 22: [0, 0, 0, 0, 0, 1, 1, 0] Days 23: [0, 1, 1, 1, 0, 0, 0, 0] Days 24: [0, 0, 1, 0, 0, 1, 1, 0] Days 25: [0, 0, 1, 0, 0, 0, 0, 0] Days 26: [0, 0, 1, 0, 1, 1, 1, 0] Days 27: [0, 0, 1, 1, 0, 1, 0, 0] Days 28: [0, 0, 0, 0, 1, 1, 0, 0] Days 29: [0, 1, 1, 0, 0, 0, 0, 0] Days 30: [0, 0, 0, 0, 1, 1, 1, 0] ``` 發現 Days 01 跟 Days 15 會重複,之後就會一直重複這個循環 再看另一個範例 ``` Input: cells = [1,0,0,1,0,0,1,0], n = 30 Days 00: [1, 0, 0, 1, 0, 0, 1, 0] Days 01: [0, 0, 0, 1, 0, 0, 1, 0] Days 02: [0, 1, 0, 1, 0, 0, 1, 0] Days 03: [0, 1, 1, 1, 0, 0, 1, 0] Days 04: [0, 0, 1, 0, 0, 0, 1, 0] Days 05: [0, 0, 1, 0, 1, 0, 1, 0] Days 06: [0, 0, 1, 1, 1, 1, 1, 0] Days 07: [0, 0, 0, 1, 1, 1, 0, 0] Days 08: [0, 1, 0, 0, 1, 0, 0, 0] Days 09: [0, 1, 0, 0, 1, 0, 1, 0] Days 10: [0, 1, 0, 0, 1, 1, 1, 0] Days 11: [0, 1, 0, 0, 0, 1, 0, 0] Days 12: [0, 1, 0, 1, 0, 1, 0, 0] Days 13: [0, 1, 1, 1, 1, 1, 0, 0] Days 14: [0, 0, 1, 1, 1, 0, 0, 0] Days 15: [0, 0, 0, 1, 0, 0, 1, 0] Days 16: [0, 1, 0, 1, 0, 0, 1, 0] Days 17: [0, 1, 1, 1, 0, 0, 1, 0] Days 18: [0, 0, 1, 0, 0, 0, 1, 0] Days 19: [0, 0, 1, 0, 1, 0, 1, 0] Days 20: [0, 0, 1, 1, 1, 1, 1, 0] Days 21: [0, 0, 0, 1, 1, 1, 0, 0] Days 22: [0, 1, 0, 0, 1, 0, 0, 0] Days 23: [0, 1, 0, 0, 1, 0, 1, 0] Days 24: [0, 1, 0, 0, 1, 1, 1, 0] Days 25: [0, 1, 0, 0, 0, 1, 0, 0] Days 26: [0, 1, 0, 1, 0, 1, 0, 0] Days 27: [0, 1, 1, 1, 1, 1, 0, 0] Days 28: [0, 0, 1, 1, 1, 0, 0, 0] Days 29: [0, 0, 0, 1, 0, 0, 1, 0] Days 30: [0, 1, 0, 1, 0, 0, 1, 0] ``` 發現 Days 01 也會在 Days 15 重複 雖然不知道原因,到觀察到了規律就可以解題了 這裡還有一個額外要注意的點是,如果頭尾在一開始都是 0 的時候就要從 Days 00 開始觀察 題目裡的 $n=10^9$ 顯然不能夠用暴力運算,那會超時 發現這個規律就可以看 n % 14 是多少,然後再經過一點運算就可以得到答案了 --- [作業](https://github.com/GametreeRoger/LeetCode/blob/main/LeetCode957.playground/Contents.swift) ## Alex 補充資料 1. Input Size https://www.youtube.com/watch?v=eG99FDBeuJo 2. XOR https://leetcode.com/problems/single-number/ 3. Why does this pattern repeat after 14 cycles instead of 256, can you give a proof? https://math.stackexchange.com/questions/3311568/why-does-this-pattern-repeat-after-14-cycles-instead-of-256-can-you-give-a-proo