diff --git a/Solution/1137. N-th Tribonacci Number/1137. N-th Tribonacci Number.py b/Solution/1137. N-th Tribonacci Number/1137. N-th Tribonacci Number.py new file mode 100644 index 0000000..216db1f --- /dev/null +++ b/Solution/1137. N-th Tribonacci Number/1137. N-th Tribonacci Number.py @@ -0,0 +1,6 @@ +class Solution: + def tribonacci(self, n: int) -> int: + a, b, c = 0, 1, 1 + for _ in range(n): + a, b, c = b, c, a + b + c + return a \ No newline at end of file diff --git a/Solution/1137. N-th Tribonacci Number/readme.md b/Solution/1137. N-th Tribonacci Number/readme.md new file mode 100644 index 0000000..332f460 --- /dev/null +++ b/Solution/1137. N-th Tribonacci Number/readme.md @@ -0,0 +1,536 @@ + + +# [1137. N-th Tribonacci Number](https://leetcode.com/problems/n-th-tribonacci-number) + +--- +- **comments**: true +- **difficulty**: Easy +- **rating**: 1142 +- **source**: Weekly Contest 147 Q1 +- **tags**: + - Memoization + - Math + - Dynamic Programming +--- + +## Description + + + +

The Tribonacci sequence Tn is defined as follows: 

+ +

T0 = 0, T1 = 1, T2 = 1, and Tn+3 = Tn + Tn+1 + Tn+2 for n >= 0.

+ +

Given n, return the value of Tn.

+ +

 

+

Example 1:

+ +
+Input: n = 4
+Output: 4
+Explanation:
+T_3 = 0 + 1 + 1 = 2
+T_4 = 1 + 1 + 2 = 4
+
+ +

Example 2:

+ +
+Input: n = 25
+Output: 1389537
+
+ +

 

+

Constraints:

+ + + + + +## Solutions + + + +### Solution 1: Dynamic Programming + +According to the recurrence relation given in the problem, we can use dynamic programming to solve it. + +We define three variables $a$, $b$, $c$ to represent $T_{n-3}$, $T_{n-2}$, $T_{n-1}$, respectively, with initial values of $0$, $1$, $1$. + +Then we decrease $n$ to $0$, updating the values of $a$, $b$, $c$ each time, until $n$ is $0$, at which point the answer is $a$. + +The time complexity is $O(n)$, and the space complexity is $O(1)$. Here, $n$ is the given integer. + + + +#### Python3 + +```python +class Solution: + def tribonacci(self, n: int) -> int: + a, b, c = 0, 1, 1 + for _ in range(n): + a, b, c = b, c, a + b + c + return a +``` + +#### Java + +```java +class Solution { + public int tribonacci(int n) { + int a = 0, b = 1, c = 1; + while (n-- > 0) { + int d = a + b + c; + a = b; + b = c; + c = d; + } + return a; + } +} +``` + +#### C++ + +```cpp +class Solution { +public: + int tribonacci(int n) { + long long a = 0, b = 1, c = 1; + while (n--) { + long long d = a + b + c; + a = b; + b = c; + c = d; + } + return (int) a; + } +}; +``` + +#### Go + +```go +func tribonacci(n int) int { + a, b, c := 0, 1, 1 + for i := 0; i < n; i++ { + a, b, c = b, c, a+b+c + } + return a +} +``` + +#### TypeScript + +```ts +function tribonacci(n: number): number { + let [a, b, c] = [0, 1, 1]; + while (n--) { + let d = a + b + c; + a = b; + b = c; + c = d; + } + return a; +} +``` + +#### JavaScript + +```js +/** + * @param {number} n + * @return {number} + */ +var tribonacci = function (n) { + let a = 0; + let b = 1; + let c = 1; + while (n--) { + let d = a + b + c; + a = b; + b = c; + c = d; + } + return a; +}; +``` + +#### PHP + +```php +class Solution { + /** + * @param Integer $n + * @return Integer + */ + function tribonacci($n) { + $a = 0; + $b = 1; + $c = 1; + + while ($n--) { + $d = $a + $b + $c; + $a = $b; + $b = $c; + $c = $d; + } + + return $a; + } +} +``` + + + + + + + +### Solution 2: Matrix Exponentiation to Accelerate Recurrence + +We define $Tib(n)$ as a $1 \times 3$ matrix $\begin{bmatrix} T_n & T_{n - 1} & T_{n - 2} \end{bmatrix}$, where $T_n$, $T_{n - 1}$ and $T_{n - 2}$ represent the $n$th, $(n - 1)$th and $(n - 2)$th Tribonacci numbers, respectively. + +We hope to derive $Tib(n)$ from $Tib(n-1) = \begin{bmatrix} T_{n - 1} & T_{n - 2} & T_{n - 3} \end{bmatrix}$. That is, we need a matrix $base$ such that $Tib(n - 1) \times base = Tib(n)$, i.e., + +$$ +\begin{bmatrix} +T_{n - 1} & T_{n - 2} & T_{n - 3} +\end{bmatrix} \times base = \begin{bmatrix} T_n & T_{n - 1} & T_{n - 2} \end{bmatrix} +$$ + +Since $T_n = T_{n - 1} + T_{n - 2} + T_{n - 3}$, the matrix $base$ is: + +$$ +\begin{bmatrix} + 1 & 1 & 0 \\ + 1 & 0 & 1 \\ + 1 & 0 & 0 +\end{bmatrix} +$$ + +We define the initial matrix $res = \begin{bmatrix} 1 & 1 & 0 \end{bmatrix}$, then $T_n$ is equal to the sum of all elements in the result matrix of $res$ multiplied by $base^{n - 3}$. This can be solved using matrix exponentiation. + +The time complexity is $O(\log n)$, and the space complexity is $O(1)$. + + + +#### Python3 + +```python +import numpy as np + + +class Solution: + def tribonacci(self, n: int) -> int: + if n == 0: + return 0 + if n < 3: + return 1 + factor = np.asmatrix([(1, 1, 0), (1, 0, 1), (1, 0, 0)], np.dtype("O")) + res = np.asmatrix([(1, 1, 0)], np.dtype("O")) + n -= 3 + while n: + if n & 1: + res *= factor + factor *= factor + n >>= 1 + return res.sum() +``` + +#### Java + +```java +class Solution { + public int tribonacci(int n) { + if (n == 0) { + return 0; + } + if (n < 3) { + return 1; + } + int[][] a = {{1, 1, 0}, {1, 0, 1}, {1, 0, 0}}; + int[][] res = pow(a, n - 3); + int ans = 0; + for (int x : res[0]) { + ans += x; + } + return ans; + } + + private int[][] mul(int[][] a, int[][] b) { + int m = a.length, n = b[0].length; + int[][] c = new int[m][n]; + for (int i = 0; i < m; ++i) { + for (int j = 0; j < n; ++j) { + for (int k = 0; k < b.length; ++k) { + c[i][j] += a[i][k] * b[k][j]; + } + } + } + return c; + } + + private int[][] pow(int[][] a, int n) { + int[][] res = {{1, 1, 0}}; + while (n > 0) { + if ((n & 1) == 1) { + res = mul(res, a); + } + a = mul(a, a); + n >>= 1; + } + return res; + } +} +``` + +#### C++ + +```cpp +class Solution { +public: + int tribonacci(int n) { + if (n == 0) { + return 0; + } + if (n < 3) { + return 1; + } + vector> a = {{1, 1, 0}, {1, 0, 1}, {1, 0, 0}}; + vector> res = pow(a, n - 3); + return accumulate(res[0].begin(), res[0].end(), 0); + } + +private: + using ll = long long; + vector> mul(vector>& a, vector>& b) { + int m = a.size(), n = b[0].size(); + vector> c(m, vector(n)); + for (int i = 0; i < m; ++i) { + for (int j = 0; j < n; ++j) { + for (int k = 0; k < b.size(); ++k) { + c[i][j] += a[i][k] * b[k][j]; + } + } + } + return c; + } + + vector> pow(vector>& a, int n) { + vector> res = {{1, 1, 0}}; + while (n) { + if (n & 1) { + res = mul(res, a); + } + a = mul(a, a); + n >>= 1; + } + return res; + } +}; +``` + +#### Go + +```go +func tribonacci(n int) (ans int) { + if n == 0 { + return 0 + } + if n < 3 { + return 1 + } + a := [][]int{{1, 1, 0}, {1, 0, 1}, {1, 0, 0}} + res := pow(a, n-3) + for _, x := range res[0] { + ans += x + } + return +} + +func mul(a, b [][]int) [][]int { + m, n := len(a), len(b[0]) + c := make([][]int, m) + for i := range c { + c[i] = make([]int, n) + } + for i := 0; i < m; i++ { + for j := 0; j < n; j++ { + for k := 0; k < len(b); k++ { + c[i][j] += a[i][k] * b[k][j] + } + } + } + return c +} + +func pow(a [][]int, n int) [][]int { + res := [][]int{{1, 1, 0}} + for n > 0 { + if n&1 == 1 { + res = mul(res, a) + } + a = mul(a, a) + n >>= 1 + } + return res +} +``` + +#### 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 +/** + * @param {number} n + * @return {number} + */ +var tribonacci = function (n) { + 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, b) { + 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, n) { + let res = [[1, 1, 0]]; + while (n) { + if (n & 1) { + res = mul(res, a); + } + a = mul(a, a); + n >>= 1; + } + return res; +} +``` + +#### 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; + } +} +``` + + + + + + \ No newline at end of file