{"id":709,"date":"2020-09-26T11:13:15","date_gmt":"2020-09-26T03:13:15","guid":{"rendered":"http:\/\/39.96.58.60\/?p=709"},"modified":"2022-10-18T16:38:15","modified_gmt":"2022-10-18T08:38:15","slug":"leetcode-%e9%9d%a2%e8%af%95%e9%a2%98-08-01-%e4%b8%89%e6%ad%a5%e9%97%ae%e9%a2%98","status":"publish","type":"post","link":"http:\/\/www.yatenglg.cn\/blog\/?p=709","title":{"rendered":"Leetcode \u9762\u8bd5\u9898 08.01. \u4e09\u6b65\u95ee\u9898"},"content":{"rendered":"<p>\u4e09\u6b65\u95ee\u9898\u3002\u6709\u4e2a\u5c0f\u5b69\u6b63\u5728\u4e0a\u697c\u68af\uff0c\u697c\u68af\u6709n\u9636\u53f0\u9636\uff0c\u5c0f\u5b69\u4e00\u6b21\u53ef\u4ee5\u4e0a1\u9636\u30012\u9636\u62163\u9636\u3002\u5b9e\u73b0\u4e00\u79cd\u65b9\u6cd5\uff0c\u8ba1\u7b97\u5c0f\u5b69\u6709\u591a\u5c11\u79cd\u4e0a\u697c\u68af\u7684\u65b9\u5f0f\u3002\u7ed3\u679c\u53ef\u80fd\u5f88\u5927\uff0c\u4f60\u9700\u8981\u5bf9\u7ed3\u679c\u6a211000000007\u3002<\/p>\n<p><strong>\u793a\u4f8b1:<\/strong><\/p>\n<pre><strong> \u8f93\u5165<\/strong>\uff1an = 3 \n\n<strong> \u8f93\u51fa<\/strong>\uff1a4\n\n<strong> \u8bf4\u660e<\/strong>: \u6709\u56db\u79cd\u8d70\u6cd5\n\n<\/pre>\n<p><strong>\u793a\u4f8b2:<\/strong><\/p>\n<pre><strong> \u8f93\u5165<\/strong>\uff1an = 5\n\n<strong> \u8f93\u51fa<\/strong>\uff1a13\n\n<\/pre>\n<p><strong>\u63d0\u793a:<\/strong><\/p>\n<ol>\n<li>n\u8303\u56f4\u5728[1, 1000000]\u4e4b\u95f4<\/li>\n<\/ol>\n<p>**\u96be\u5ea6**: Easy<\/p>\n<p>**\u6807\u7b7e**: \u52a8\u6001\u89c4\u5212\u3001<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-python\" data-lang=\"Python\"><code>\n# -*- coding: utf-8 -*-\n# @Author  : LG\n\n\"\"\"\n\u8d85\u65f6\n\u89e3\u9898\u601d\u8def\uff1a\n    \u52a8\u6001\u89c4\u5212\uff0c\u5f53n\u975e\u5e38\u5927\u65f6\uff0c\u9700\u8981\u5faa\u73af\u8ba1\u7b97n\u6b21\uff0c\u8d85\u65f6\n\"\"\"\nclass Solution:\n    def waysToStep(self, n: int) -&gt; int:\n        if n == 1:\n            return 1\n        if n == 2:\n            return 2\n        if n == 3:\n            return 4\n\n        dp = [[] for _ in range(n)]\n        dp[0] = 1\n        dp[1] = 2\n        dp[2] = 4\n\n        for i in range(3, n):\n            dp[i] = dp[i-1] + dp[i-2] + dp[i-3]\n        return dp[-1]%1000000007\n\n\"\"\"\n\u6267\u884c\u7528\u65f6\uff1a2020 ms, \u5728\u6240\u6709 Python3 \u63d0\u4ea4\u4e2d\u51fb\u8d25\u4e865.18% \u7684\u7528\u6237\n\u5185\u5b58\u6d88\u8017\uff1a29.1 MB, \u5728\u6240\u6709 Python3 \u63d0\u4ea4\u4e2d\u51fb\u8d25\u4e8651.83% \u7684\u7528\u6237\n\n\n\u89e3\u9898\u601d\u8def\uff1a\n    \u4f18\u5316\uff0c\u5feb\u901f\u5e42\n                                  [[1,1,0],\n    [ dp[i-1], dp[i-2], dp[i-3]]*  [1,0,1],  = dp[i-1]+dp[i-2]+dp[i-3], dp[i-1], dp[i-2]\n                                   [1,0,0]]\n    \n    \u901a\u8fc7\u4e0a\u5f0f\uff0c\u53ef\u4ee5\u5feb\u901f\u5f97\u51fa\uff0cdp[i] = dp[i-1]+dp[i-2]+dp[i-3]\n    \n    \u53ef\u5f97\u51fa\uff1a\n                                              [[1,1,0],\n        [dp[i], dp[i-1], dp[i-2]] = [1,2,4] *  [1,0,1], ^^n-3\n                                              [1,0,0]]\n    \u4e5f\u5c31\u662f\uff0c[1,2,4] * A ** (n-3)\n    \u4e3a\u5feb\u901f\u8ba1\u7b97A**n,\u4f7f\u7528\u5feb\u901f\u5e42\u65b9\u6cd5\u8ba1\u7b97\n    \n    \u5feb\u901f\u5e42\uff1a\n        \u8ba1\u7b97a**n \u6b21\u65b9\u65f6\uff0c\n         \u82e5n\u4e3a\u5076\u6570\uff0c\u53ef\u5148\u8ba1\u7b97 a**(n\/2) \uff0c\u7136\u540e\u8ba1\u7b97 (a**(n\/2))**2\n         \u82e5n\u4e3a\u5947\u6570\uff0c\u53ef\u5148\u8ba1\u7b97 a**((n-1)\/2), \u7136\u540e\u8ba1\u7b97 a*a**((n-1)\/2)**2  \n         \n\"\"\"\nimport numpy as np\n\nclass Solution:\n    def waysToStep(self, n: int) -&gt; int:\n        if n == 1:\n            return 1\n        if n == 2:\n            return 2\n        if n == 3:\n            return 4\n        if n == 4:\n            return 7\n        init_array = np.array([4, 2, 1], dtype=np.int64)\n        A = np.array([[1, 1, 0], [1, 0, 1], [1, 0, 0]], dtype=np.int64)\n        A1 = A.astype(np.int64)\n        if (n - 3) % 2 == 0:\n            for i in range(int((n - 3) \/ 2 - 1)):\n                A1 = np.matmul(A1, A).astype(np.int64)\n                A1 = np.mod(A1, 1000000007)\n            A = np.matmul(A1, A1).astype(np.int64)\n\n        else:\n            for i in range(int((n - 4) \/ 2 -1)):\n                A1 = np.matmul(A1, A)\n                A1 = np.mod(A1, 1000000007)\n            A1 = np.matmul(A1, A1)\n            A = np.matmul(A, A1)\n        A = np.mod(A, 1000000007)\n        return int(np.mod(np.matmul(init_array, A)[0], 1000000007))\n\n\"\"\"\n\u6267\u884c\u7528\u65f6\uff1a108 ms, \u5728\u6240\u6709 Python3 \u63d0\u4ea4\u4e2d\u51fb\u8d25\u4e8699.12% \u7684\u7528\u6237\n\u5185\u5b58\u6d88\u8017\uff1a29.3 MB, \u5728\u6240\u6709 Python3 \u63d0\u4ea4\u4e2d\u51fb\u8d25\u4e8650.50% \u7684\u7528\u6237\n    \n\u89e3\u9898\u601d\u8def\uff1a\n    \u66f4\u6df1\u5165\u7684\uff0c\u6211\u4eec\u5c06\u4e8c\u5206\u7684\u5feb\u901f\u5e42\uff0c\u518d\u7ec6\u5206\n    \u5982\uff1a  a**8 = ((a**2)**2)**2      \n    \u5982\uff1a  a**7 = a*((a**2)**2)\n    \n    \u4f8b\uff1a  a**n\n            n = 6\u65f6       \u5076\u6570\uff0c\u8ba1\u7b97\u5f53\u524d\u6b21\u65b9      \u8bb0\u5f55\u5947\u6570\n        n = 6               a                 \n        n = 6 &gt;&gt; 1 = 3      a**2 = a**2         a**2   \n        n = 3 &gt;&gt; 1 = 1      a**2 = a**4 \n        \n                                    a**4 * a**2 = a**6\n        \n            n = 7\u65f6       n**7 \n        n = 7               a                   a\n        n = 7 &gt;&gt; 1 = 3      a**2 = a**2         a**2\n        n = 3 &gt;&gt; 1 = 1      a**2 = a**4         \n        \n                                    a**4 * a * a**2 = a**7\n                                    \n            n = 15\u65f6      n**15      \n        n = 15               a                   a\n        n = 15 &gt;&gt; 1 = 7     a**2 = a**2          a**2\n        n = 7 &gt;&gt; 1 = 3      a**2 = a**4          a**4\n        n = 3 &gt;&gt; 1 = 1      a**2 = a**8          \n        \n                                    a**8 * a * a**2 * a**4 = a**15 \n    \u53ef\u4ee5\u770b\u51fa\uff0cn\u4f9d\u6b21\u9664\u4ee52\u5411\u4e0b\u53d6\u6574\uff0c\u5e76\u5bf9a\u7d2f\u6b21\u65b9\uff0c\n        \u5f53\u9047\u5230n\u4e3a\u5947\u6570\u65f6\uff0c\u8bb0\u5f55\u5f53\u524d\u6b21\u65b9\u6570\uff0c\n        \u6700\u540e\u5c06\u6700\u7ec8\u7684\u6b21\u65b9\u6570\u4e0e \u5947\u6570\u65f6\u8bb0\u5f55\u7684 \u6240\u6709\u76f8\u4e58\u5373\u53ef\n    \n    \u5177\u4f53\u5b9e\u73b0\u89c1\u4ee3\u7801\u6ce8\u91ca\n\"\"\"\nimport numpy as np\n\nclass Solution:\n    def waysToStep(self, n: int) -&gt; int:\n        if n == 1:\n            return 1\n        if n == 2:\n            return 2\n        if n == 3:\n            return 4\n\n        init_array = np.array([4, 2, 1], dtype=np.int64)\n        A = np.array([[1, 1, 0], [1, 0, 1], [1, 0, 0]]).astype(np.int64)\n\n        A = self.mat_pow(A, n-3)\n        init_array = np.matmul(init_array, A).astype(np.int64)[0]\n        return int(init_array % 1000000007)\n\n    def mat_pow(self, A, n):\n        e = np.eye(3, dtype=np.int64)  # \u7528\u4e8e\u7d2f\u8ba1 \u5947\u6570\u65f6\u7684 \u6b21\u65b9\u4e58\u79ef\n        while n &gt; 0:\n            if (n &amp; 1) != 0:    # \u5224\u65ad\u5947\u5076\n                e = np.matmul(e, A)    # \u5f53\u662f\u5947\u6570\u65f6\uff0c \u7d2f\u8ba1\u5f53\u524d\u6b21\u65b9\u4e58\u79ef\n                e = np.mod(e, 1000000007)   # \u53d6\u6a21\n            A = np.matmul(A, A).astype(np.int64)    # \u8ba1\u7b97\u5f53\u524d\u6b21\u65b9\u548c\n            A = np.mod(A, 1000000007)\n            n = n &gt;&gt; 1  # \/2\u5411\u4e0b\u53d6\u6574\n        return e<\/code><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u4e09\u6b65\u95ee\u9898\u3002\u6709\u4e2a\u5c0f\u5b69\u6b63\u5728\u4e0a\u697c\u68af\uff0c\u697c\u68af\u6709n\u9636\u53f0\u9636\uff0c\u5c0f\u5b69\u4e00\u6b21\u53ef\u4ee5\u4e0a1\u9636\u30012\u9636\u62163\u9636\u3002\u5b9e\u73b0\u4e00\u79cd\u65b9\u6cd5\uff0c\u8ba1\u7b97\u5c0f\u5b69\u6709\u591a\u5c11\u79cd\u4e0a&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":[],"categories":[11,1],"tags":[],"_links":{"self":[{"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=\/wp\/v2\/posts\/709"}],"collection":[{"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=709"}],"version-history":[{"count":1,"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=\/wp\/v2\/posts\/709\/revisions"}],"predecessor-version":[{"id":710,"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=\/wp\/v2\/posts\/709\/revisions\/710"}],"wp:attachment":[{"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=709"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=709"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=709"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}