diff --git a/solution/1100-1199/1137.N-th Tribonacci Number/README.md b/solution/1100-1199/1137.N-th Tribonacci Number/README.md index deaef11a7eb04..16e3dbc030568 100644 --- a/solution/1100-1199/1137.N-th Tribonacci Number/README.md +++ b/solution/1100-1199/1137.N-th Tribonacci Number/README.md @@ -132,43 +132,14 @@ func tribonacci(n int) int { ```ts function tribonacci(n: number): number { - if (n === 0) { - return 0; - } - if (n < 3) { - return 1; - } - const a = [ - [1, 1, 0], - [1, 0, 1], - [1, 0, 0], - ]; - return pow(a, n - 3)[0].reduce((a, b) => a + b); -} - -function mul(a: number[][], b: number[][]): number[][] { - const [m, n] = [a.length, b[0].length]; - const c = Array.from({ length: m }, () => Array.from({ length: n }, () => 0)); - for (let i = 0; i < m; ++i) { - for (let j = 0; j < n; ++j) { - for (let k = 0; k < b.length; ++k) { - c[i][j] += a[i][k] * b[k][j]; - } - } - } - return c; -} - -function pow(a: number[][], n: number): number[][] { - let res = [[1, 1, 0]]; - while (n) { - if (n & 1) { - res = mul(res, a); - } - a = mul(a, a); - n >>= 1; + let [a, b, c] = [0, 1, 1]; + while (n--) { + let d = a + b + c; + a = b; + b = c; + c = d; } - return res; + return a; } ``` @@ -202,16 +173,18 @@ class Solution { * @return Integer */ function tribonacci($n) { - if ($n == 0) { - return 0; - } elseif ($n == 1 || $n == 2) { - return 1; - } - $dp = [0, 1, 1]; - for ($i = 3; $i <= $n; $i++) { - $dp[$i] = $dp[$i - 1] + $dp[$i - 2] + $dp[$i - 3]; + $a = 0; + $b = 1; + $c = 1; + + while ($n--) { + $d = $a + $b + $c; + $a = $b; + $b = $c; + $c = $d; } - return $dp[$n]; + + return $a; } } ``` @@ -413,6 +386,50 @@ func pow(a [][]int, n int) [][]int { } ``` +#### TypeScript + +```ts +function tribonacci(n: number): number { + if (n === 0) { + return 0; + } + if (n < 3) { + return 1; + } + const a = [ + [1, 1, 0], + [1, 0, 1], + [1, 0, 0], + ]; + return pow(a, n - 3)[0].reduce((a, b) => a + b); +} + +function mul(a: number[][], b: number[][]): number[][] { + const [m, n] = [a.length, b[0].length]; + const c = Array.from({ length: m }, () => Array.from({ length: n }, () => 0)); + for (let i = 0; i < m; ++i) { + for (let j = 0; j < n; ++j) { + for (let k = 0; k < b.length; ++k) { + c[i][j] += a[i][k] * b[k][j]; + } + } + } + return c; +} + +function pow(a: number[][], n: number): number[][] { + let res = [[1, 1, 0]]; + while (n) { + if (n & 1) { + res = mul(res, a); + } + a = mul(a, a); + n >>= 1; + } + return res; +} +``` + #### JavaScript ```js @@ -461,6 +478,60 @@ function pow(a, n) { } ``` +#### PHP + +```php +class Solution { + /** + * @param Integer $n + * @return Integer + */ + function tribonacci($n) { + if ($n === 0) { + return 0; + } + if ($n < 3) { + return 1; + } + + $a = [[1, 1, 0], [1, 0, 1], [1, 0, 0]]; + + $res = $this->pow($a, $n - 3); + return array_sum($res[0]); + } + + private function mul($a, $b) { + $m = count($a); + $n = count($b[0]); + $p = count($b); + + $c = array_fill(0, $m, array_fill(0, $n, 0)); + + for ($i = 0; $i < $m; ++$i) { + for ($j = 0; $j < $n; ++$j) { + for ($k = 0; $k < $p; ++$k) { + $c[$i][$j] += $a[$i][$k] * $b[$k][$j]; + } + } + } + + return $c; + } + + private function pow($a, $n) { + $res = [[1, 1, 0]]; + while ($n > 0) { + if ($n & 1) { + $res = $this->mul($res, $a); + } + $a = $this->mul($a, $a); + $n >>= 1; + } + return $res; + } +} +``` + diff --git a/solution/1100-1199/1137.N-th Tribonacci Number/README_EN.md b/solution/1100-1199/1137.N-th Tribonacci Number/README_EN.md index 110e5fd597d5e..cc4e3d2b0ac54 100644 --- a/solution/1100-1199/1137.N-th Tribonacci Number/README_EN.md +++ b/solution/1100-1199/1137.N-th Tribonacci Number/README_EN.md @@ -132,43 +132,14 @@ func tribonacci(n int) int { ```ts function tribonacci(n: number): number { - if (n === 0) { - return 0; - } - if (n < 3) { - return 1; - } - const a = [ - [1, 1, 0], - [1, 0, 1], - [1, 0, 0], - ]; - return pow(a, n - 3)[0].reduce((a, b) => a + b); -} - -function mul(a: number[][], b: number[][]): number[][] { - const [m, n] = [a.length, b[0].length]; - const c = Array.from({ length: m }, () => Array.from({ length: n }, () => 0)); - for (let i = 0; i < m; ++i) { - for (let j = 0; j < n; ++j) { - for (let k = 0; k < b.length; ++k) { - c[i][j] += a[i][k] * b[k][j]; - } - } - } - return c; -} - -function pow(a: number[][], n: number): number[][] { - let res = [[1, 1, 0]]; - while (n) { - if (n & 1) { - res = mul(res, a); - } - a = mul(a, a); - n >>= 1; + let [a, b, c] = [0, 1, 1]; + while (n--) { + let d = a + b + c; + a = b; + b = c; + c = d; } - return res; + return a; } ``` @@ -202,16 +173,18 @@ class Solution { * @return Integer */ function tribonacci($n) { - if ($n == 0) { - return 0; - } elseif ($n == 1 || $n == 2) { - return 1; - } - $dp = [0, 1, 1]; - for ($i = 3; $i <= $n; $i++) { - $dp[$i] = $dp[$i - 1] + $dp[$i - 2] + $dp[$i - 3]; + $a = 0; + $b = 1; + $c = 1; + + while ($n--) { + $d = $a + $b + $c; + $a = $b; + $b = $c; + $c = $d; } - return $dp[$n]; + + return $a; } } ``` @@ -413,6 +386,50 @@ func pow(a [][]int, n int) [][]int { } ``` +#### TypeScript + +```ts +function tribonacci(n: number): number { + if (n === 0) { + return 0; + } + if (n < 3) { + return 1; + } + const a = [ + [1, 1, 0], + [1, 0, 1], + [1, 0, 0], + ]; + return pow(a, n - 3)[0].reduce((a, b) => a + b); +} + +function mul(a: number[][], b: number[][]): number[][] { + const [m, n] = [a.length, b[0].length]; + const c = Array.from({ length: m }, () => Array.from({ length: n }, () => 0)); + for (let i = 0; i < m; ++i) { + for (let j = 0; j < n; ++j) { + for (let k = 0; k < b.length; ++k) { + c[i][j] += a[i][k] * b[k][j]; + } + } + } + return c; +} + +function pow(a: number[][], n: number): number[][] { + let res = [[1, 1, 0]]; + while (n) { + if (n & 1) { + res = mul(res, a); + } + a = mul(a, a); + n >>= 1; + } + return res; +} +``` + #### JavaScript ```js @@ -461,6 +478,60 @@ function pow(a, n) { } ``` +#### PHP + +```php +class Solution { + /** + * @param Integer $n + * @return Integer + */ + function tribonacci($n) { + if ($n === 0) { + return 0; + } + if ($n < 3) { + return 1; + } + + $a = [[1, 1, 0], [1, 0, 1], [1, 0, 0]]; + + $res = $this->pow($a, $n - 3); + return array_sum($res[0]); + } + + private function mul($a, $b) { + $m = count($a); + $n = count($b[0]); + $p = count($b); + + $c = array_fill(0, $m, array_fill(0, $n, 0)); + + for ($i = 0; $i < $m; ++$i) { + for ($j = 0; $j < $n; ++$j) { + for ($k = 0; $k < $p; ++$k) { + $c[$i][$j] += $a[$i][$k] * $b[$k][$j]; + } + } + } + + return $c; + } + + private function pow($a, $n) { + $res = [[1, 1, 0]]; + while ($n > 0) { + if ($n & 1) { + $res = $this->mul($res, $a); + } + $a = $this->mul($a, $a); + $n >>= 1; + } + return $res; + } +} +``` + diff --git a/solution/1100-1199/1137.N-th Tribonacci Number/Solution.php b/solution/1100-1199/1137.N-th Tribonacci Number/Solution.php index e1ccd36d8f62b..4e9ee4f966719 100644 --- a/solution/1100-1199/1137.N-th Tribonacci Number/Solution.php +++ b/solution/1100-1199/1137.N-th Tribonacci Number/Solution.php @@ -4,15 +4,17 @@ class Solution { * @return Integer */ function tribonacci($n) { - if ($n == 0) { - return 0; - } elseif ($n == 1 || $n == 2) { - return 1; + $a = 0; + $b = 1; + $c = 1; + + while ($n--) { + $d = $a + $b + $c; + $a = $b; + $b = $c; + $c = $d; } - $dp = [0, 1, 1]; - for ($i = 3; $i <= $n; $i++) { - $dp[$i] = $dp[$i - 1] + $dp[$i - 2] + $dp[$i - 3]; - } - return $dp[$n]; + + return $a; } -} +} \ No newline at end of file diff --git a/solution/1100-1199/1137.N-th Tribonacci Number/Solution.ts b/solution/1100-1199/1137.N-th Tribonacci Number/Solution.ts index d65d17f3418c4..b9489094b8b69 100644 --- a/solution/1100-1199/1137.N-th Tribonacci Number/Solution.ts +++ b/solution/1100-1199/1137.N-th Tribonacci Number/Solution.ts @@ -1,39 +1,10 @@ function tribonacci(n: number): number { - if (n === 0) { - return 0; - } - if (n < 3) { - return 1; - } - const a = [ - [1, 1, 0], - [1, 0, 1], - [1, 0, 0], - ]; - return pow(a, n - 3)[0].reduce((a, b) => a + b); -} - -function mul(a: number[][], b: number[][]): number[][] { - const [m, n] = [a.length, b[0].length]; - const c = Array.from({ length: m }, () => Array.from({ length: n }, () => 0)); - for (let i = 0; i < m; ++i) { - for (let j = 0; j < n; ++j) { - for (let k = 0; k < b.length; ++k) { - c[i][j] += a[i][k] * b[k][j]; - } - } - } - return c; -} - -function pow(a: number[][], n: number): number[][] { - let res = [[1, 1, 0]]; - while (n) { - if (n & 1) { - res = mul(res, a); - } - a = mul(a, a); - n >>= 1; - } - return res; + let [a, b, c] = [0, 1, 1]; + while (n--) { + let d = a + b + c; + a = b; + b = c; + c = d; + } + return a; } diff --git a/solution/1100-1199/1137.N-th Tribonacci Number/Solution2.php b/solution/1100-1199/1137.N-th Tribonacci Number/Solution2.php new file mode 100644 index 0000000000000..d84a65effd0d3 --- /dev/null +++ b/solution/1100-1199/1137.N-th Tribonacci Number/Solution2.php @@ -0,0 +1,49 @@ +class Solution { + /** + * @param Integer $n + * @return Integer + */ + function tribonacci($n) { + if ($n === 0) { + return 0; + } + if ($n < 3) { + return 1; + } + + $a = [[1, 1, 0], [1, 0, 1], [1, 0, 0]]; + + $res = $this->pow($a, $n - 3); + return array_sum($res[0]); + } + + private function mul($a, $b) { + $m = count($a); + $n = count($b[0]); + $p = count($b); + + $c = array_fill(0, $m, array_fill(0, $n, 0)); + + for ($i = 0; $i < $m; ++$i) { + for ($j = 0; $j < $n; ++$j) { + for ($k = 0; $k < $p; ++$k) { + $c[$i][$j] += $a[$i][$k] * $b[$k][$j]; + } + } + } + + return $c; + } + + private function pow($a, $n) { + $res = [[1, 1, 0]]; + while ($n > 0) { + if ($n & 1) { + $res = $this->mul($res, $a); + } + $a = $this->mul($a, $a); + $n >>= 1; + } + return $res; + } +} \ No newline at end of file diff --git a/solution/1100-1199/1137.N-th Tribonacci Number/Solution2.ts b/solution/1100-1199/1137.N-th Tribonacci Number/Solution2.ts new file mode 100644 index 0000000000000..d65d17f3418c4 --- /dev/null +++ b/solution/1100-1199/1137.N-th Tribonacci Number/Solution2.ts @@ -0,0 +1,39 @@ +function tribonacci(n: number): number { + if (n === 0) { + return 0; + } + if (n < 3) { + return 1; + } + const a = [ + [1, 1, 0], + [1, 0, 1], + [1, 0, 0], + ]; + return pow(a, n - 3)[0].reduce((a, b) => a + b); +} + +function mul(a: number[][], b: number[][]): number[][] { + const [m, n] = [a.length, b[0].length]; + const c = Array.from({ length: m }, () => Array.from({ length: n }, () => 0)); + for (let i = 0; i < m; ++i) { + for (let j = 0; j < n; ++j) { + for (let k = 0; k < b.length; ++k) { + c[i][j] += a[i][k] * b[k][j]; + } + } + } + return c; +} + +function pow(a: number[][], n: number): number[][] { + let res = [[1, 1, 0]]; + while (n) { + if (n & 1) { + res = mul(res, a); + } + a = mul(a, a); + n >>= 1; + } + return res; +}