LeetCode 1025 - Divisor Game


https://leetcode.com/problems/divisor-game/
Alice and Bob take turns playing a game, with Alice starting first.
Initially, there is a number N on the chalkboard.  On each player's turn, that player makes a move consisting of:
  • Choosing any x with 0 < x < N and N % x == 0.
  • Replacing the number N on the chalkboard with N - x.
Also, if a player cannot make a move, they lose the game.
Return True if and only if Alice wins the game, assuming both players play optimally.

    Example 1:
    Input: 2
    Output: true
    Explanation: Alice chooses 1, and Bob has no more moves.
    
    Example 2:
    Input: 3
    Output: false
    Explanation: Alice chooses 1, Bob chooses 1, and Alice has no more moves.
    

    Note:
    1. 1 <= N <= 1000

    https://leetcode.com/problems/divisor-game/discuss/274606/JavaC%2B%2BPython-return-N-2-0
    If N is even, can win.
    If N is odd, will lose.

    Recursive Prove (Top-down)

    1. If N is even.
      We can choose x = 1.
      The opponent will get N - 1, which is a odd.
      Reduce to the case odd and he will lose.
    2. If N is odd,
      2.1 If N = 1, lose directly.
      2.2 We have to choose an odd x.
      The opponent will get N - x, which is a even.
      Reduce to the case even and he will win.
    3. So the N will change odd and even alternatively until N = 1.

    Mathematical Induction Prove (Bottom-up)

    1. N = 1, lose directly
    2. N = 2, will win choosing x = 1.
    3. N = 3, must lose choosing x = 1.
    4. N = 4, will win choosing x = 1.
    ....
    For N <= n, we have find that:
    If N is even, can win.
    If N is odd, will lose.
    For the case N = n + 1
    If N is even, we can win choosing x = 1,
    give the opponent an odd number N - 1 = n,
    force him to lose,
    because we have found that all odd N <= n will lose.
    If N is odd, there is no even x that N % x == 0.
    As a result, we give the opponent a even number N - x,
    and the opponent can win,
    because we have found that all even N <= n can win.
    Now we prove that, for all N <= n,
    If N is even, can win.
    If N is odd, will lose.
    Java/C++:
            return N % 2 == 0;
    https://leetcode.com/problems/divisor-game/discuss/274566/just-return-N-2-0-(proof)
    prove it by two steps:
    1. if Alice will lose for N, then Alice will must win for N+1, since Alice can first just make N decrease 1.
    2. for any odd number N, it only has odd factor, so after the first move, it will be an even number
    let's check the inference
    fisrt N = 1, Alice lose. then Alice will must win for 2.
    if N = 3, since all even number(2) smaller than 3 will leads Alice win, so Alice will lose for 3
    3 lose -> 4 win
    all even number(2,4) smaller than 5 will leads Alice win, so Alice will lose for 5
    ...
    Therefore, Alice will always win for even number, lose for odd number.

    X. DP
    https://leetcode.com/problems/divisor-game/discuss/274608/Simple-DP-Java-Solution
    dp[i] indicates the result of the game for the given number i and for the player who started the game.
    Alice will try all factors and choose the one which gives his opponent a losing value.
    public boolean divisorGame(int N) {
            boolean[] dp = new boolean[N+1];
            dp[0] = false;
            dp[1] = false;
            for(int i=2; i <= N; i++){
                for(int j=1; j < i; j++){
                    if(i % j == 0){
                        if(dp[i-j] == false){
                            dp[i] = true;
                            break;
                        }
                    }
                }
            }
            return dp[N];
        }
    https://leetcode.com/problems/divisor-game/discuss/274581/Share-my-stupid-Java-dp-solution
    dp[i] represents whether a player can win given the number i if he is the first turn.
    class Solution {
        public boolean divisorGame(int N) {
            boolean[] dp = new boolean[N+1];
            for(int i = 1; i <= N; i++){
                for(int x = 1; x < i; x++){
                    if(i%x == 0 && !dp[i-x]){
                        dp[i] = true;
                        break;
                    }
                }
            }
            return dp[N];
        }
    https://leetcode.com/problems/divisor-game/discuss/274590/C%2B%2B-Recursive-DP
    I know, there is a mathematical solution, but in case you did not figure it out :)
    int dp[1001] = {};
    bool divisorGame(int N, bool res = false) {
      if (dp[N] != 0) return dp[N] == 1;
      for (auto i = 1; !res && i * 2 <= N; ++i) {
        if (N % i == 0) res = !divisorGame(N - i);
      }
      dp[N] = res ? 1 : -1;
      return res;
    }



    Labels

    LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

    Popular Posts