diff --git a/solution/2900-2999/2992.Number of Self-Divisible Permutations/README.md b/solution/2900-2999/2992.Number of Self-Divisible Permutations/README.md
new file mode 100644
index 0000000000000..571460593765b
--- /dev/null
+++ b/solution/2900-2999/2992.Number of Self-Divisible Permutations/README.md
@@ -0,0 +1,341 @@
+# [2992. Number of Self-Divisible Permutations](https://leetcode.cn/problems/number-of-self-divisible-permutations)
+
+[English Version](/solution/2900-2999/2992.Number%20of%20Self-Divisible%20Permutations/README_EN.md)
+
+## 题目描述
+
+
+
+
Given an integer n
, return the number of permutations of the 1-indexed array nums = [1, 2, ..., n]
, such that it's self-divisible.
+
+Array nums
is self-divisible if for every 1 <= i <= n
, at least one of the following conditions holds:
+
+
+ nums[i] % i == 0
+ i % nums[i] == 0
+
+
+A permutation of an array is a rearrangement of the elements of that array, for example here are all of the permutations of the array [1, 2, 3]
:
+
+
+ [1, 2, 3]
+ [1, 3, 2]
+ [2, 1, 3]
+ [2, 3, 1]
+ [3, 1, 2]
+ [3, 2, 1]
+
+
+
+Example 1:
+
+
+Input: n = 1
+Output: 1
+Explanation: The array [1] has only 1 permutation which is self-divisible.
+
+
+Example 2:
+
+
+Input: n = 2
+Output: 2
+Explanation: The array [1,2] has 2 permutations both of which are self-divisible:
+nums = [1,2]: This is self-divisible since nums[1] % 1 == 0 and nums[2] % 2 == 0.
+nums = [2,1]: This is self-divisible since nums[1] % 1 == 0 and 2 % nums[2] == 0.
+
+
+Example 3:
+
+
+Input: n = 3
+Output: 3
+Explanation: The array [1,2,3] has 3 self-divisble permutations: [1,2,3], [2,1,3], [3,2,1].
+It can be shown that the other 3 permutations are not self-divisible. Hence the answer is 3.
+
+
+
+Constraints:
+
+
+
+## 解法
+
+
+
+**方法一:状态压缩 + 记忆化搜索**
+
+我们可以用一个二进制数 $mask$ 来表示当前排列的状态,其中第 $i$ 位为 $1$ 表示数字 $i$ 已经被使用,为 $0$ 表示数字 $i$ 还未被使用。
+
+那么,我们设计一个函数 $dfs(mask)$,表示从当前排列的状态 $mask$ 开始,能够构造出的满足题目要求的排列的数量。答案即为 $dfs(0)$。
+
+我们可以用记忆化搜索的方法来计算 $dfs(mask)$ 的值。
+
+在计算 $dfs(mask)$ 的过程中,我们用 $i$ 表示当前要加入排列的是第几个数字,如果 $i \gt n$,说明排列已经构造完毕,我们可以返回 $1$。
+
+否则,我们枚举当前排列中还未被使用的数字 $j$,如果 $i$ 和 $j$ 满足题目要求,那么我们就可以将 $j$ 加入排列中,此时状态变为 $mask \mid 2^j$,其中 $|$ 表示按位或运算。由于 $j$ 已经被使用,因此我们需要递归计算 $dfs(mask \mid 2^j)$ 的值,并将其累加到 $dfs(mask)$ 上。
+
+最终,我们可以得到 $dfs(0)$ 的值,即为答案。
+
+时间复杂度 $O(n \times 2^n)$,空间复杂度 $O(2^n)$。其中 $n$ 为排列的长度。
+
+**方法二:状态压缩 + 动态规划**
+
+我们可以将方法一中的记忆化搜索改写为动态规划的形式,定义 $f[mask]$ 表示当前排列的状态为 $mask$,且满足题目要求的排列的数量。初始时 $f[0]=1$,其余值均为 $0$。
+
+我们在 $[0, 2^n)$ 的范围内枚举 $mask$,对于每个 $mask$,我们用 $i$ 表示当前最后一个加入排列的是第几个数字,然后我们枚举当前排列中最后一个加入的数字 $j$,如果 $i$ 和 $j$ 满足题目要求,那么状态 $f[mask]$ 就可以从状态 $f[mask \oplus 2^(j-1)]$ 转移而来,其中 $\oplus$ 表示按位异或运算。我们将所有转移得到的状态 $f[mask \oplus 2^(j-1)]$ 的值累加到 $f[mask]$ 上,即为 $f[mask]$ 的值。
+
+最终,我们可以得到 $f[2^n - 1]$ 的值,即为答案。
+
+时间复杂度 $O(n \times 2^n)$,空间复杂度 $O(2^n)$。其中 $n$ 为排列的长度。
+
+
+
+### **Python3**
+
+
+
+```python
+class Solution:
+ def selfDivisiblePermutationCount(self, n: int) -> int:
+ @cache
+ def dfs(mask: int) -> int:
+ i = mask.bit_count() + 1
+ if i > n:
+ return 1
+ ans = 0
+ for j in range(1, n + 1):
+ if (mask >> j & 1) == 0 and (i % j == 0 or j % i == 0):
+ ans += dfs(mask | 1 << j)
+ return ans
+
+ return dfs(0)
+```
+
+```python
+class Solution:
+ def selfDivisiblePermutationCount(self, n: int) -> int:
+ f = [0] * (1 << n)
+ f[0] = 1
+ for mask in range(1 << n):
+ i = mask.bit_count()
+ for j in range(1, n + 1):
+ if (mask >> (j - 1) & 1) == 1 and (i % j == 0 or j % i == 0):
+ f[mask] += f[mask ^ (1 << (j - 1))]
+ return f[-1]
+```
+
+### **Java**
+
+
+
+```java
+class Solution {
+ private int n;
+ private Integer[] f;
+
+ public int selfDivisiblePermutationCount(int n) {
+ this.n = n;
+ f = new Integer[1 << (n + 1)];
+ return dfs(0);
+ }
+
+ private int dfs(int mask) {
+ if (f[mask] != null) {
+ return f[mask];
+ }
+ int i = Integer.bitCount(mask) + 1;
+ if (i > n) {
+ return 1;
+ }
+ f[mask] = 0;
+ for (int j = 1; j <= n; ++j) {
+ if ((mask >> j & 1) == 0 && (i % j == 0 || j % i == 0)) {
+ f[mask] += dfs(mask | 1 << j);
+ }
+ }
+ return f[mask];
+ }
+}
+```
+
+```java
+class Solution {
+ public int selfDivisiblePermutationCount(int n) {
+ int[] f = new int[1 << n];
+ f[0] = 1;
+ for (int mask = 0; mask < 1 << n; ++mask) {
+ int i = Integer.bitCount(mask);
+ for (int j = 1; j <= n; ++j) {
+ if (((mask >> (j - 1)) & 1) == 1 && (i % j == 0 || j % i == 0)) {
+ f[mask] += f[mask ^ (1 << (j - 1))];
+ }
+ }
+ }
+ return f[(1 << n) - 1];
+ }
+}
+```
+
+### **C++**
+
+```cpp
+class Solution {
+public:
+ int selfDivisiblePermutationCount(int n) {
+ int f[1 << (n + 1)];
+ memset(f, -1, sizeof(f));
+ function dfs = [&](int mask) {
+ if (f[mask] != -1) {
+ return f[mask];
+ }
+ int i = __builtin_popcount(mask) + 1;
+ if (i > n) {
+ return 1;
+ }
+ f[mask] = 0;
+ for (int j = 1; j <= n; ++j) {
+ if ((mask >> j & 1) == 0 && (i % j == 0 || j % i == 0)) {
+ f[mask] += dfs(mask | 1 << j);
+ }
+ }
+ return f[mask];
+ };
+ return dfs(0);
+ }
+};
+```
+
+```cpp
+class Solution {
+public:
+ int selfDivisiblePermutationCount(int n) {
+ int f[1 << n];
+ memset(f, 0, sizeof(f));
+ f[0] = 1;
+ for (int mask = 0; mask < 1 << n; ++mask) {
+ int i = __builtin_popcount(mask);
+ for (int j = 1; j <= n; ++j) {
+ if (((mask >> (j - 1)) & 1) == 1 && (i % j == 0 || j % i == 0)) {
+ f[mask] += f[mask ^ (1 << (j - 1))];
+ }
+ }
+ }
+ return f[(1 << n) - 1];
+ }
+};
+```
+
+### **Go**
+
+```go
+func selfDivisiblePermutationCount(n int) int {
+ f := make([]int, 1<<(n+1))
+ for i := range f {
+ f[i] = -1
+ }
+ var dfs func(int) int
+ dfs = func(mask int) int {
+ if f[mask] != -1 {
+ return f[mask]
+ }
+ i := bits.OnesCount(uint(mask)) + 1
+ if i > n {
+ return 1
+ }
+ f[mask] = 0
+ for j := 1; j <= n; j++ {
+ if mask>>j&1 == 0 && (i%j == 0 || j%i == 0) {
+ f[mask] += dfs(mask | 1<>(j-1)&1 == 1 && (i%j == 0 || j%i == 0) {
+ f[mask] += f[mask^(1<<(j-1))]
+ }
+ }
+ }
+ return f[(1< {
+ if (f[mask] !== -1) {
+ return f[mask];
+ }
+ const i = bitCount(mask) + 1;
+ if (i > n) {
+ return 1;
+ }
+ f[mask] = 0;
+ for (let j = 1; j <= n; ++j) {
+ if (((mask >> j) & 1) === 0 && (i % j === 0 || j % i === 0)) {
+ f[mask] += dfs(mask | (1 << j));
+ }
+ }
+ return f[mask];
+ };
+ return dfs(0);
+}
+
+function bitCount(i: number): number {
+ i = i - ((i >>> 1) & 0x55555555);
+ i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
+ i = (i + (i >>> 4)) & 0x0f0f0f0f;
+ i = i + (i >>> 8);
+ i = i + (i >>> 16);
+ return i & 0x3f;
+}
+```
+
+```ts
+function selfDivisiblePermutationCount(n: number): number {
+ const f: number[] = Array(1 << n).fill(0);
+ f[0] = 1;
+ for (let mask = 0; mask < 1 << n; ++mask) {
+ const i = bitCount(mask);
+ for (let j = 1; j <= n; ++j) {
+ if ((mask >> (j - 1)) & 1 && (i % j === 0 || j % i === 0)) {
+ f[mask] += f[mask ^ (1 << (j - 1))];
+ }
+ }
+ }
+ return f.at(-1)!;
+}
+
+function bitCount(i: number): number {
+ i = i - ((i >>> 1) & 0x55555555);
+ i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
+ i = (i + (i >>> 4)) & 0x0f0f0f0f;
+ i = i + (i >>> 8);
+ i = i + (i >>> 16);
+ return i & 0x3f;
+}
+```
+
+### **...**
+
+```
+
+```
+
+
diff --git a/solution/2900-2999/2992.Number of Self-Divisible Permutations/README_EN.md b/solution/2900-2999/2992.Number of Self-Divisible Permutations/README_EN.md
new file mode 100644
index 0000000000000..85d596213d6c3
--- /dev/null
+++ b/solution/2900-2999/2992.Number of Self-Divisible Permutations/README_EN.md
@@ -0,0 +1,333 @@
+# [2992. Number of Self-Divisible Permutations](https://leetcode.com/problems/number-of-self-divisible-permutations)
+
+[中文文档](/solution/2900-2999/2992.Number%20of%20Self-Divisible%20Permutations/README.md)
+
+## Description
+
+Given an integer n
, return the number of permutations of the 1-indexed array nums = [1, 2, ..., n]
, such that it's self-divisible.
+
+Array nums
is self-divisible if for every 1 <= i <= n
, at least one of the following conditions holds:
+
+
+ nums[i] % i == 0
+ i % nums[i] == 0
+
+
+A permutation of an array is a rearrangement of the elements of that array, for example here are all of the permutations of the array [1, 2, 3]
:
+
+
+ [1, 2, 3]
+ [1, 3, 2]
+ [2, 1, 3]
+ [2, 3, 1]
+ [3, 1, 2]
+ [3, 2, 1]
+
+
+
+Example 1:
+
+
+Input: n = 1
+Output: 1
+Explanation: The array [1] has only 1 permutation which is self-divisible.
+
+
+Example 2:
+
+
+Input: n = 2
+Output: 2
+Explanation: The array [1,2] has 2 permutations both of which are self-divisible:
+nums = [1,2]: This is self-divisible since nums[1] % 1 == 0 and nums[2] % 2 == 0.
+nums = [2,1]: This is self-divisible since nums[1] % 1 == 0 and 2 % nums[2] == 0.
+
+
+Example 3:
+
+
+Input: n = 3
+Output: 3
+Explanation: The array [1,2,3] has 3 self-divisble permutations: [1,2,3], [2,1,3], [3,2,1].
+It can be shown that the other 3 permutations are not self-divisible. Hence the answer is 3.
+
+
+
+Constraints:
+
+
+
+## Solutions
+
+**Solution 1: State Compression + Memoization Search**
+
+We can use a binary number $mask$ to represent the current permutation state, where the $i$-th bit is $1$ indicates that the number $i$ has been used, and $0$ indicates that the number $i$ has not been used yet.
+
+Then, we design a function $dfs(mask)$, which represents the number of permutations that can be constructed from the current permutation state $mask$ and meet the requirements of the problem. The answer is $dfs(0)$.
+
+We can use the method of memoization search to calculate the value of $dfs(mask)$.
+
+In the process of calculating $dfs(mask)$, we use $i$ to indicate which number is to be added to the permutation. If $i \gt n$, it means that the permutation has been constructed, and we can return $1$.
+
+Otherwise, we enumerate the numbers $j$ that have not been used in the current permutation. If $i$ and $j$ meet the requirements of the problem, then we can add $j$ to the permutation. At this time, the state becomes $mask \mid 2^j$, where $|$ represents bitwise OR operation. Since $j$ has been used, we need to recursively calculate the value of $dfs(mask \mid 2^j)$ and add it to $dfs(mask)$.
+
+Finally, we can get the value of $dfs(0)$, which is the answer.
+
+The time complexity is $O(n \times 2^n)$, and the space complexity is $O(2^n)$. Where $n$ is the length of the permutation.
+
+**Solution 2: State Compression + Dynamic Programming**
+
+We can rewrite the memoization search in Solution 1 into the form of dynamic programming, define $f[mask]$ to represent the number of permutations that the current permutation state is $mask$ and meet the requirements of the problem. Initially, $f[0]=1$, and the rest are $0$.
+
+We enumerate $mask$ in the range of $[0, 2^n)$, for each $mask$, we use $i$ to represent which number is the last one to join the permutation, then we enumerate the last number $j$ added to the current permutation. If $i$ and $j$ meet the requirements of the problem, then the state $f[mask]$ can be transferred from the state $f[mask \oplus 2^(j-1)]$, where $\oplus$ represents bitwise XOR operation. We add all the values of the transferred state $f[mask \oplus 2^(j-1)]$ to $f[mask]$, which is the value of $f[mask]$.
+
+Finally, we can get the value of $f[2^n - 1]$, which is the answer.
+
+The time complexity is $O(n \times 2^n)$, and the space complexity is $O(2^n)$. Where $n$ is the length of the permutation.
+
+
+
+### **Python3**
+
+```python
+class Solution:
+ def selfDivisiblePermutationCount(self, n: int) -> int:
+ @cache
+ def dfs(mask: int) -> int:
+ i = mask.bit_count() + 1
+ if i > n:
+ return 1
+ ans = 0
+ for j in range(1, n + 1):
+ if (mask >> j & 1) == 0 and (i % j == 0 or j % i == 0):
+ ans += dfs(mask | 1 << j)
+ return ans
+
+ return dfs(0)
+```
+
+```python
+class Solution:
+ def selfDivisiblePermutationCount(self, n: int) -> int:
+ f = [0] * (1 << n)
+ f[0] = 1
+ for mask in range(1 << n):
+ i = mask.bit_count()
+ for j in range(1, n + 1):
+ if (mask >> (j - 1) & 1) == 1 and (i % j == 0 or j % i == 0):
+ f[mask] += f[mask ^ (1 << (j - 1))]
+ return f[-1]
+```
+
+### **Java**
+
+```java
+class Solution {
+ private int n;
+ private Integer[] f;
+
+ public int selfDivisiblePermutationCount(int n) {
+ this.n = n;
+ f = new Integer[1 << (n + 1)];
+ return dfs(0);
+ }
+
+ private int dfs(int mask) {
+ if (f[mask] != null) {
+ return f[mask];
+ }
+ int i = Integer.bitCount(mask) + 1;
+ if (i > n) {
+ return 1;
+ }
+ f[mask] = 0;
+ for (int j = 1; j <= n; ++j) {
+ if ((mask >> j & 1) == 0 && (i % j == 0 || j % i == 0)) {
+ f[mask] += dfs(mask | 1 << j);
+ }
+ }
+ return f[mask];
+ }
+}
+```
+
+```java
+class Solution {
+ public int selfDivisiblePermutationCount(int n) {
+ int[] f = new int[1 << n];
+ f[0] = 1;
+ for (int mask = 0; mask < 1 << n; ++mask) {
+ int i = Integer.bitCount(mask);
+ for (int j = 1; j <= n; ++j) {
+ if (((mask >> (j - 1)) & 1) == 1 && (i % j == 0 || j % i == 0)) {
+ f[mask] += f[mask ^ (1 << (j - 1))];
+ }
+ }
+ }
+ return f[(1 << n) - 1];
+ }
+}
+```
+
+### **C++**
+
+```cpp
+class Solution {
+public:
+ int selfDivisiblePermutationCount(int n) {
+ int f[1 << (n + 1)];
+ memset(f, -1, sizeof(f));
+ function dfs = [&](int mask) {
+ if (f[mask] != -1) {
+ return f[mask];
+ }
+ int i = __builtin_popcount(mask) + 1;
+ if (i > n) {
+ return 1;
+ }
+ f[mask] = 0;
+ for (int j = 1; j <= n; ++j) {
+ if ((mask >> j & 1) == 0 && (i % j == 0 || j % i == 0)) {
+ f[mask] += dfs(mask | 1 << j);
+ }
+ }
+ return f[mask];
+ };
+ return dfs(0);
+ }
+};
+```
+
+```cpp
+class Solution {
+public:
+ int selfDivisiblePermutationCount(int n) {
+ int f[1 << n];
+ memset(f, 0, sizeof(f));
+ f[0] = 1;
+ for (int mask = 0; mask < 1 << n; ++mask) {
+ int i = __builtin_popcount(mask);
+ for (int j = 1; j <= n; ++j) {
+ if (((mask >> (j - 1)) & 1) == 1 && (i % j == 0 || j % i == 0)) {
+ f[mask] += f[mask ^ (1 << (j - 1))];
+ }
+ }
+ }
+ return f[(1 << n) - 1];
+ }
+};
+```
+
+### **Go**
+
+```go
+func selfDivisiblePermutationCount(n int) int {
+ f := make([]int, 1<<(n+1))
+ for i := range f {
+ f[i] = -1
+ }
+ var dfs func(int) int
+ dfs = func(mask int) int {
+ if f[mask] != -1 {
+ return f[mask]
+ }
+ i := bits.OnesCount(uint(mask)) + 1
+ if i > n {
+ return 1
+ }
+ f[mask] = 0
+ for j := 1; j <= n; j++ {
+ if mask>>j&1 == 0 && (i%j == 0 || j%i == 0) {
+ f[mask] += dfs(mask | 1<>(j-1)&1 == 1 && (i%j == 0 || j%i == 0) {
+ f[mask] += f[mask^(1<<(j-1))]
+ }
+ }
+ }
+ return f[(1< {
+ if (f[mask] !== -1) {
+ return f[mask];
+ }
+ const i = bitCount(mask) + 1;
+ if (i > n) {
+ return 1;
+ }
+ f[mask] = 0;
+ for (let j = 1; j <= n; ++j) {
+ if (((mask >> j) & 1) === 0 && (i % j === 0 || j % i === 0)) {
+ f[mask] += dfs(mask | (1 << j));
+ }
+ }
+ return f[mask];
+ };
+ return dfs(0);
+}
+
+function bitCount(i: number): number {
+ i = i - ((i >>> 1) & 0x55555555);
+ i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
+ i = (i + (i >>> 4)) & 0x0f0f0f0f;
+ i = i + (i >>> 8);
+ i = i + (i >>> 16);
+ return i & 0x3f;
+}
+```
+
+```ts
+function selfDivisiblePermutationCount(n: number): number {
+ const f: number[] = Array(1 << n).fill(0);
+ f[0] = 1;
+ for (let mask = 0; mask < 1 << n; ++mask) {
+ const i = bitCount(mask);
+ for (let j = 1; j <= n; ++j) {
+ if ((mask >> (j - 1)) & 1 && (i % j === 0 || j % i === 0)) {
+ f[mask] += f[mask ^ (1 << (j - 1))];
+ }
+ }
+ }
+ return f.at(-1)!;
+}
+
+function bitCount(i: number): number {
+ i = i - ((i >>> 1) & 0x55555555);
+ i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
+ i = (i + (i >>> 4)) & 0x0f0f0f0f;
+ i = i + (i >>> 8);
+ i = i + (i >>> 16);
+ return i & 0x3f;
+}
+```
+
+### **...**
+
+```
+
+```
+
+
diff --git a/solution/2900-2999/2992.Number of Self-Divisible Permutations/Solution.cpp b/solution/2900-2999/2992.Number of Self-Divisible Permutations/Solution.cpp
new file mode 100644
index 0000000000000..f31e25d832287
--- /dev/null
+++ b/solution/2900-2999/2992.Number of Self-Divisible Permutations/Solution.cpp
@@ -0,0 +1,24 @@
+class Solution {
+public:
+ int selfDivisiblePermutationCount(int n) {
+ int f[1 << (n + 1)];
+ memset(f, -1, sizeof(f));
+ function dfs = [&](int mask) {
+ if (f[mask] != -1) {
+ return f[mask];
+ }
+ int i = __builtin_popcount(mask) + 1;
+ if (i > n) {
+ return 1;
+ }
+ f[mask] = 0;
+ for (int j = 1; j <= n; ++j) {
+ if ((mask >> j & 1) == 0 && (i % j == 0 || j % i == 0)) {
+ f[mask] += dfs(mask | 1 << j);
+ }
+ }
+ return f[mask];
+ };
+ return dfs(0);
+ }
+};
\ No newline at end of file
diff --git a/solution/2900-2999/2992.Number of Self-Divisible Permutations/Solution.go b/solution/2900-2999/2992.Number of Self-Divisible Permutations/Solution.go
new file mode 100644
index 0000000000000..44cef2f1ee413
--- /dev/null
+++ b/solution/2900-2999/2992.Number of Self-Divisible Permutations/Solution.go
@@ -0,0 +1,24 @@
+func selfDivisiblePermutationCount(n int) int {
+ f := make([]int, 1<<(n+1))
+ for i := range f {
+ f[i] = -1
+ }
+ var dfs func(int) int
+ dfs = func(mask int) int {
+ if f[mask] != -1 {
+ return f[mask]
+ }
+ i := bits.OnesCount(uint(mask)) + 1
+ if i > n {
+ return 1
+ }
+ f[mask] = 0
+ for j := 1; j <= n; j++ {
+ if mask>>j&1 == 0 && (i%j == 0 || j%i == 0) {
+ f[mask] += dfs(mask | 1< n) {
+ return 1;
+ }
+ f[mask] = 0;
+ for (int j = 1; j <= n; ++j) {
+ if ((mask >> j & 1) == 0 && (i % j == 0 || j % i == 0)) {
+ f[mask] += dfs(mask | 1 << j);
+ }
+ }
+ return f[mask];
+ }
+}
\ No newline at end of file
diff --git a/solution/2900-2999/2992.Number of Self-Divisible Permutations/Solution.py b/solution/2900-2999/2992.Number of Self-Divisible Permutations/Solution.py
new file mode 100644
index 0000000000000..87d935310af7a
--- /dev/null
+++ b/solution/2900-2999/2992.Number of Self-Divisible Permutations/Solution.py
@@ -0,0 +1,14 @@
+class Solution:
+ def selfDivisiblePermutationCount(self, n: int) -> int:
+ @cache
+ def dfs(mask: int) -> int:
+ i = mask.bit_count() + 1
+ if i > n:
+ return 1
+ ans = 0
+ for j in range(1, n + 1):
+ if (mask >> j & 1) == 0 and (i % j == 0 or j % i == 0):
+ ans += dfs(mask | 1 << j)
+ return ans
+
+ return dfs(0)
diff --git a/solution/2900-2999/2992.Number of Self-Divisible Permutations/Solution.ts b/solution/2900-2999/2992.Number of Self-Divisible Permutations/Solution.ts
new file mode 100644
index 0000000000000..dfb8e2280e083
--- /dev/null
+++ b/solution/2900-2999/2992.Number of Self-Divisible Permutations/Solution.ts
@@ -0,0 +1,29 @@
+function selfDivisiblePermutationCount(n: number): number {
+ const f: number[] = Array(1 << (n + 1)).fill(-1);
+ const dfs = (mask: number): number => {
+ if (f[mask] !== -1) {
+ return f[mask];
+ }
+ const i = bitCount(mask) + 1;
+ if (i > n) {
+ return 1;
+ }
+ f[mask] = 0;
+ for (let j = 1; j <= n; ++j) {
+ if (((mask >> j) & 1) === 0 && (i % j === 0 || j % i === 0)) {
+ f[mask] += dfs(mask | (1 << j));
+ }
+ }
+ return f[mask];
+ };
+ return dfs(0);
+}
+
+function bitCount(i: number): number {
+ i = i - ((i >>> 1) & 0x55555555);
+ i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
+ i = (i + (i >>> 4)) & 0x0f0f0f0f;
+ i = i + (i >>> 8);
+ i = i + (i >>> 16);
+ return i & 0x3f;
+}
diff --git a/solution/DATABASE_README.md b/solution/DATABASE_README.md
index 698c8e029750f..5f7c802c2c8ad 100644
--- a/solution/DATABASE_README.md
+++ b/solution/DATABASE_README.md
@@ -247,15 +247,15 @@
| 2854 | [滚动平均步数](/solution/2800-2899/2854.Rolling%20Average%20Steps/README.md) | `数据库` | 中等 | 🔒 |
| 2893 | [计算每个区间内的订单](/solution/2800-2899/2893.Calculate%20Orders%20Within%20Each%20Interval/README.md) | `数据库` | 中等 | 🔒 |
| 2922 | [市场分析 III](/solution/2900-2999/2922.Market%20Analysis%20III/README.md) | `数据库` | 中等 | 🔒 |
-| 2978 | [Symmetric Coordinates](/solution/2900-2999/2978.Symmetric%20Coordinates/README.md) | | 中等 | 🔒 |
-| 2984 | [Find Peak Calling Hours for Each City](/solution/2900-2999/2984.Find%20Peak%20Calling%20Hours%20for%20Each%20City/README.md) | | 中等 | 🔒 |
-| 2985 | [Calculate Compressed Mean](/solution/2900-2999/2985.Calculate%20Compressed%20Mean/README.md) | | 简单 | 🔒 |
-| 2986 | [Find Third Transaction](/solution/2900-2999/2986.Find%20Third%20Transaction/README.md) | | 中等 | 🔒 |
-| 2987 | [Find Expensive Cities](/solution/2900-2999/2987.Find%20Expensive%20Cities/README.md) | | 简单 | 🔒 |
-| 2988 | [Manager of the Largest Department](/solution/2900-2999/2988.Manager%20of%20the%20Largest%20Department/README.md) | | 中等 | 🔒 |
-| 2989 | [班级表现](/solution/2900-2999/2989.Class%20Performance/README.md) | | 中等 | 🔒 |
-| 2990 | [贷款类型](/solution/2900-2999/2990.Loan%20Types/README.md) | | 简单 | 🔒 |
-| 2991 | [最好的三家酒庄](/solution/2900-2999/2991.Top%20Three%20Wineries/README.md) | | 困难 | 🔒 |
+| 2978 | [Symmetric Coordinates](/solution/2900-2999/2978.Symmetric%20Coordinates/README.md) | `数据库` | 中等 | 🔒 |
+| 2984 | [找到每座城市的高峰通话时间](/solution/2900-2999/2984.Find%20Peak%20Calling%20Hours%20for%20Each%20City/README.md) | `数据库` | 中等 | 🔒 |
+| 2985 | [计算订单平均商品数量](/solution/2900-2999/2985.Calculate%20Compressed%20Mean/README.md) | `数据库` | 简单 | 🔒 |
+| 2986 | [找到第三笔交易](/solution/2900-2999/2986.Find%20Third%20Transaction/README.md) | `数据库` | 中等 | 🔒 |
+| 2987 | [寻找房价最贵的城市](/solution/2900-2999/2987.Find%20Expensive%20Cities/README.md) | `数据库` | 简单 | 🔒 |
+| 2988 | [最大部门的经理](/solution/2900-2999/2988.Manager%20of%20the%20Largest%20Department/README.md) | `数据库` | 中等 | 🔒 |
+| 2989 | [班级表现](/solution/2900-2999/2989.Class%20Performance/README.md) | `数据库` | 中等 | 🔒 |
+| 2990 | [贷款类型](/solution/2900-2999/2990.Loan%20Types/README.md) | `数据库` | 简单 | 🔒 |
+| 2991 | [最好的三家酒庄](/solution/2900-2999/2991.Top%20Three%20Wineries/README.md) | `数据库` | 困难 | 🔒 |
## 版权
diff --git a/solution/DATABASE_README_EN.md b/solution/DATABASE_README_EN.md
index 4e3b670d5d4ad..c04f0c4ff2378 100644
--- a/solution/DATABASE_README_EN.md
+++ b/solution/DATABASE_README_EN.md
@@ -245,15 +245,15 @@ Press Control + F(or Command + F on
| 2854 | [Rolling Average Steps](/solution/2800-2899/2854.Rolling%20Average%20Steps/README_EN.md) | `Database` | Medium | 🔒 |
| 2893 | [Calculate Orders Within Each Interval](/solution/2800-2899/2893.Calculate%20Orders%20Within%20Each%20Interval/README_EN.md) | `Database` | Medium | 🔒 |
| 2922 | [Market Analysis III](/solution/2900-2999/2922.Market%20Analysis%20III/README_EN.md) | `Database` | Medium | 🔒 |
-| 2978 | [Symmetric Coordinates](/solution/2900-2999/2978.Symmetric%20Coordinates/README_EN.md) | | Medium | 🔒 |
-| 2984 | [Find Peak Calling Hours for Each City](/solution/2900-2999/2984.Find%20Peak%20Calling%20Hours%20for%20Each%20City/README_EN.md) | | Medium | 🔒 |
-| 2985 | [Calculate Compressed Mean](/solution/2900-2999/2985.Calculate%20Compressed%20Mean/README_EN.md) | | Easy | 🔒 |
-| 2986 | [Find Third Transaction](/solution/2900-2999/2986.Find%20Third%20Transaction/README_EN.md) | | Medium | 🔒 |
-| 2987 | [Find Expensive Cities](/solution/2900-2999/2987.Find%20Expensive%20Cities/README_EN.md) | | Easy | 🔒 |
-| 2988 | [Manager of the Largest Department](/solution/2900-2999/2988.Manager%20of%20the%20Largest%20Department/README_EN.md) | | Medium | 🔒 |
-| 2989 | [Class Performance](/solution/2900-2999/2989.Class%20Performance/README_EN.md) | | Medium | 🔒 |
-| 2990 | [Loan Types](/solution/2900-2999/2990.Loan%20Types/README_EN.md) | | Easy | 🔒 |
-| 2991 | [Top Three Wineries](/solution/2900-2999/2991.Top%20Three%20Wineries/README_EN.md) | | Hard | 🔒 |
+| 2978 | [Symmetric Coordinates](/solution/2900-2999/2978.Symmetric%20Coordinates/README_EN.md) | `Database` | Medium | 🔒 |
+| 2984 | [Find Peak Calling Hours for Each City](/solution/2900-2999/2984.Find%20Peak%20Calling%20Hours%20for%20Each%20City/README_EN.md) | `Database` | Medium | 🔒 |
+| 2985 | [Calculate Compressed Mean](/solution/2900-2999/2985.Calculate%20Compressed%20Mean/README_EN.md) | `Database` | Easy | 🔒 |
+| 2986 | [Find Third Transaction](/solution/2900-2999/2986.Find%20Third%20Transaction/README_EN.md) | `Database` | Medium | 🔒 |
+| 2987 | [Find Expensive Cities](/solution/2900-2999/2987.Find%20Expensive%20Cities/README_EN.md) | `Database` | Easy | 🔒 |
+| 2988 | [Manager of the Largest Department](/solution/2900-2999/2988.Manager%20of%20the%20Largest%20Department/README_EN.md) | `Database` | Medium | 🔒 |
+| 2989 | [Class Performance](/solution/2900-2999/2989.Class%20Performance/README_EN.md) | `Database` | Medium | 🔒 |
+| 2990 | [Loan Types](/solution/2900-2999/2990.Loan%20Types/README_EN.md) | `Database` | Easy | 🔒 |
+| 2991 | [Top Three Wineries](/solution/2900-2999/2991.Top%20Three%20Wineries/README_EN.md) | `Database` | Hard | 🔒 |
## Copyright
diff --git a/solution/README.md b/solution/README.md
index 4c47b82587da1..2a7be74c805d2 100644
--- a/solution/README.md
+++ b/solution/README.md
@@ -2979,29 +2979,30 @@
| 2966 | [划分数组并满足最大差限制](/solution/2900-2999/2966.Divide%20Array%20Into%20Arrays%20With%20Max%20Difference/README.md) | | 中等 | 第 376 场周赛 |
| 2967 | [使数组成为等数数组的最小代价](/solution/2900-2999/2967.Minimum%20Cost%20to%20Make%20Array%20Equalindromic/README.md) | `贪心`,`数组`,`数学`,`排序` | 中等 | 第 376 场周赛 |
| 2968 | [执行操作使频率分数最大](/solution/2900-2999/2968.Apply%20Operations%20to%20Maximize%20Frequency%20Score/README.md) | `数组`,`二分查找`,`前缀和`,`排序`,`滑动窗口` | 困难 | 第 376 场周赛 |
-| 2969 | [购买水果需要的最少金币数 II](/solution/2900-2999/2969.Minimum%20Number%20of%20Coins%20for%20Fruits%20II/README.md) | `队列`,`数组`,`动态规划`,`单调队列` | 困难 | 🔒 |
-| 2970 | [统计移除递增子数组的数目 I](/solution/2900-2999/2970.Count%20the%20Number%20of%20Incremovable%20Subarrays%20I/README.md) | | 简单 | 第 120 场双周赛 |
-| 2971 | [找到最大周长的多边形](/solution/2900-2999/2971.Find%20Polygon%20With%20the%20Largest%20Perimeter/README.md) | | 中等 | 第 120 场双周赛 |
-| 2972 | [统计移除递增子数组的数目 II](/solution/2900-2999/2972.Count%20the%20Number%20of%20Incremovable%20Subarrays%20II/README.md) | | 困难 | 第 120 场双周赛 |
-| 2973 | [树中每个节点放置的金币数目](/solution/2900-2999/2973.Find%20Number%20of%20Coins%20to%20Place%20in%20Tree%20Nodes/README.md) | | 困难 | 第 120 场双周赛 |
-| 2974 | [最小数字游戏](/solution/2900-2999/2974.Minimum%20Number%20Game/README.md) | | 简单 | 第 377 场周赛 |
-| 2975 | [移除栅栏得到的正方形田地的最大面积](/solution/2900-2999/2975.Maximum%20Square%20Area%20by%20Removing%20Fences%20From%20a%20Field/README.md) | | 中等 | 第 377 场周赛 |
-| 2976 | [转换字符串的最小成本 I](/solution/2900-2999/2976.Minimum%20Cost%20to%20Convert%20String%20I/README.md) | | 中等 | 第 377 场周赛 |
-| 2977 | [转换字符串的最小成本 II](/solution/2900-2999/2977.Minimum%20Cost%20to%20Convert%20String%20II/README.md) | | 困难 | 第 377 场周赛 |
-| 2978 | [Symmetric Coordinates](/solution/2900-2999/2978.Symmetric%20Coordinates/README.md) | | 中等 | 🔒 |
-| 2979 | [最贵的无法购买的商品](/solution/2900-2999/2979.Most%20Expensive%20Item%20That%20Can%20Not%20Be%20Bought/README.md) | | 中等 | 🔒 |
-| 2980 | [检查按位或是否存在尾随零](/solution/2900-2999/2980.Check%20if%20Bitwise%20OR%20Has%20Trailing%20Zeros/README.md) | | 简单 | 第 378 场周赛 |
-| 2981 | [找出出现至少三次的最长特殊子字符串 I](/solution/2900-2999/2981.Find%20Longest%20Special%20Substring%20That%20Occurs%20Thrice%20I/README.md) | | 中等 | 第 378 场周赛 |
-| 2982 | [找出出现至少三次的最长特殊子字符串 II](/solution/2900-2999/2982.Find%20Longest%20Special%20Substring%20That%20Occurs%20Thrice%20II/README.md) | | 中等 | 第 378 场周赛 |
-| 2983 | [回文串重新排列查询](/solution/2900-2999/2983.Palindrome%20Rearrangement%20Queries/README.md) | | 困难 | 第 378 场周赛 |
-| 2984 | [Find Peak Calling Hours for Each City](/solution/2900-2999/2984.Find%20Peak%20Calling%20Hours%20for%20Each%20City/README.md) | | 中等 | 🔒 |
-| 2985 | [Calculate Compressed Mean](/solution/2900-2999/2985.Calculate%20Compressed%20Mean/README.md) | | 简单 | 🔒 |
-| 2986 | [Find Third Transaction](/solution/2900-2999/2986.Find%20Third%20Transaction/README.md) | | 中等 | 🔒 |
-| 2987 | [Find Expensive Cities](/solution/2900-2999/2987.Find%20Expensive%20Cities/README.md) | | 简单 | 🔒 |
-| 2988 | [Manager of the Largest Department](/solution/2900-2999/2988.Manager%20of%20the%20Largest%20Department/README.md) | | 中等 | 🔒 |
-| 2989 | [班级表现](/solution/2900-2999/2989.Class%20Performance/README.md) | | 中等 | 🔒 |
-| 2990 | [贷款类型](/solution/2900-2999/2990.Loan%20Types/README.md) | | 简单 | 🔒 |
-| 2991 | [最好的三家酒庄](/solution/2900-2999/2991.Top%20Three%20Wineries/README.md) | | 困难 | 🔒 |
+| 2969 | [购买水果需要的最少金币数 II](/solution/2900-2999/2969.Minimum%20Number%20of%20Coins%20for%20Fruits%20II/README.md) | `队列`,`数组`,`动态规划`,`单调队列`,`堆(优先队列)` | 困难 | 🔒 |
+| 2970 | [统计移除递增子数组的数目 I](/solution/2900-2999/2970.Count%20the%20Number%20of%20Incremovable%20Subarrays%20I/README.md) | `数组`,`双指针`,`二分查找`,`枚举` | 简单 | 第 120 场双周赛 |
+| 2971 | [找到最大周长的多边形](/solution/2900-2999/2971.Find%20Polygon%20With%20the%20Largest%20Perimeter/README.md) | `贪心`,`数组`,`前缀和`,`排序` | 中等 | 第 120 场双周赛 |
+| 2972 | [统计移除递增子数组的数目 II](/solution/2900-2999/2972.Count%20the%20Number%20of%20Incremovable%20Subarrays%20II/README.md) | `数组`,`双指针`,`二分查找` | 困难 | 第 120 场双周赛 |
+| 2973 | [树中每个节点放置的金币数目](/solution/2900-2999/2973.Find%20Number%20of%20Coins%20to%20Place%20in%20Tree%20Nodes/README.md) | `树`,`深度优先搜索`,`动态规划`,`排序`,`堆(优先队列)` | 困难 | 第 120 场双周赛 |
+| 2974 | [最小数字游戏](/solution/2900-2999/2974.Minimum%20Number%20Game/README.md) | `排序`,`数组`,`模拟`,`堆(优先队列)` | 简单 | 第 377 场周赛 |
+| 2975 | [移除栅栏得到的正方形田地的最大面积](/solution/2900-2999/2975.Maximum%20Square%20Area%20by%20Removing%20Fences%20From%20a%20Field/README.md) | `数组`,`哈希表`,`枚举` | 中等 | 第 377 场周赛 |
+| 2976 | [转换字符串的最小成本 I](/solution/2900-2999/2976.Minimum%20Cost%20to%20Convert%20String%20I/README.md) | `图`,`数组`,`字符串`,`最短路` | 中等 | 第 377 场周赛 |
+| 2977 | [转换字符串的最小成本 II](/solution/2900-2999/2977.Minimum%20Cost%20to%20Convert%20String%20II/README.md) | `图`,`字典树`,`数组`,`字符串`,`动态规划`,`最短路` | 困难 | 第 377 场周赛 |
+| 2978 | [Symmetric Coordinates](/solution/2900-2999/2978.Symmetric%20Coordinates/README.md) | `数据库` | 中等 | 🔒 |
+| 2979 | [最贵的无法购买的商品](/solution/2900-2999/2979.Most%20Expensive%20Item%20That%20Can%20Not%20Be%20Bought/README.md) | `数学`,`动态规划`,`数论` | 中等 | 🔒 |
+| 2980 | [检查按位或是否存在尾随零](/solution/2900-2999/2980.Check%20if%20Bitwise%20OR%20Has%20Trailing%20Zeros/README.md) | `位运算`,`数组` | 简单 | 第 378 场周赛 |
+| 2981 | [找出出现至少三次的最长特殊子字符串 I](/solution/2900-2999/2981.Find%20Longest%20Special%20Substring%20That%20Occurs%20Thrice%20I/README.md) | `哈希表`,`字符串`,`二分查找`,`计数`,`滑动窗口` | 中等 | 第 378 场周赛 |
+| 2982 | [找出出现至少三次的最长特殊子字符串 II](/solution/2900-2999/2982.Find%20Longest%20Special%20Substring%20That%20Occurs%20Thrice%20II/README.md) | `哈希表`,`字符串`,`二分查找`,`计数`,`滑动窗口` | 中等 | 第 378 场周赛 |
+| 2983 | [回文串重新排列查询](/solution/2900-2999/2983.Palindrome%20Rearrangement%20Queries/README.md) | `哈希表`,`字符串`,`前缀和` | 困难 | 第 378 场周赛 |
+| 2984 | [找到每座城市的高峰通话时间](/solution/2900-2999/2984.Find%20Peak%20Calling%20Hours%20for%20Each%20City/README.md) | `数据库` | 中等 | 🔒 |
+| 2985 | [计算订单平均商品数量](/solution/2900-2999/2985.Calculate%20Compressed%20Mean/README.md) | `数据库` | 简单 | 🔒 |
+| 2986 | [找到第三笔交易](/solution/2900-2999/2986.Find%20Third%20Transaction/README.md) | `数据库` | 中等 | 🔒 |
+| 2987 | [寻找房价最贵的城市](/solution/2900-2999/2987.Find%20Expensive%20Cities/README.md) | `数据库` | 简单 | 🔒 |
+| 2988 | [最大部门的经理](/solution/2900-2999/2988.Manager%20of%20the%20Largest%20Department/README.md) | `数据库` | 中等 | 🔒 |
+| 2989 | [班级表现](/solution/2900-2999/2989.Class%20Performance/README.md) | `数据库` | 中等 | 🔒 |
+| 2990 | [贷款类型](/solution/2900-2999/2990.Loan%20Types/README.md) | `数据库` | 简单 | 🔒 |
+| 2991 | [最好的三家酒庄](/solution/2900-2999/2991.Top%20Three%20Wineries/README.md) | `数据库` | 困难 | 🔒 |
+| 2992 | [Number of Self-Divisible Permutations](/solution/2900-2999/2992.Number%20of%20Self-Divisible%20Permutations/README.md) | | 中等 | 🔒 |
## 版权
diff --git a/solution/README_EN.md b/solution/README_EN.md
index 928468029f77b..3b90a6bdf9e65 100644
--- a/solution/README_EN.md
+++ b/solution/README_EN.md
@@ -2977,29 +2977,30 @@ Press Control + F(or Command + F on
| 2966 | [Divide Array Into Arrays With Max Difference](/solution/2900-2999/2966.Divide%20Array%20Into%20Arrays%20With%20Max%20Difference/README_EN.md) | | Medium | Weekly Contest 376 |
| 2967 | [Minimum Cost to Make Array Equalindromic](/solution/2900-2999/2967.Minimum%20Cost%20to%20Make%20Array%20Equalindromic/README_EN.md) | `Greedy`,`Array`,`Math`,`Sorting` | Medium | Weekly Contest 376 |
| 2968 | [Apply Operations to Maximize Frequency Score](/solution/2900-2999/2968.Apply%20Operations%20to%20Maximize%20Frequency%20Score/README_EN.md) | `Array`,`Binary Search`,`Prefix Sum`,`Sorting`,`Sliding Window` | Hard | Weekly Contest 376 |
-| 2969 | [Minimum Number of Coins for Fruits II](/solution/2900-2999/2969.Minimum%20Number%20of%20Coins%20for%20Fruits%20II/README_EN.md) | `Queue`,`Array`,`Dynamic Programming`,`Monotonic Queue` | Hard | 🔒 |
-| 2970 | [Count the Number of Incremovable Subarrays I](/solution/2900-2999/2970.Count%20the%20Number%20of%20Incremovable%20Subarrays%20I/README_EN.md) | | Easy | Biweekly Contest 120 |
-| 2971 | [Find Polygon With the Largest Perimeter](/solution/2900-2999/2971.Find%20Polygon%20With%20the%20Largest%20Perimeter/README_EN.md) | | Medium | Biweekly Contest 120 |
-| 2972 | [Count the Number of Incremovable Subarrays II](/solution/2900-2999/2972.Count%20the%20Number%20of%20Incremovable%20Subarrays%20II/README_EN.md) | | Hard | Biweekly Contest 120 |
-| 2973 | [Find Number of Coins to Place in Tree Nodes](/solution/2900-2999/2973.Find%20Number%20of%20Coins%20to%20Place%20in%20Tree%20Nodes/README_EN.md) | | Hard | Biweekly Contest 120 |
-| 2974 | [Minimum Number Game](/solution/2900-2999/2974.Minimum%20Number%20Game/README_EN.md) | | Easy | Weekly Contest 377 |
-| 2975 | [Maximum Square Area by Removing Fences From a Field](/solution/2900-2999/2975.Maximum%20Square%20Area%20by%20Removing%20Fences%20From%20a%20Field/README_EN.md) | | Medium | Weekly Contest 377 |
-| 2976 | [Minimum Cost to Convert String I](/solution/2900-2999/2976.Minimum%20Cost%20to%20Convert%20String%20I/README_EN.md) | | Medium | Weekly Contest 377 |
-| 2977 | [Minimum Cost to Convert String II](/solution/2900-2999/2977.Minimum%20Cost%20to%20Convert%20String%20II/README_EN.md) | | Hard | Weekly Contest 377 |
-| 2978 | [Symmetric Coordinates](/solution/2900-2999/2978.Symmetric%20Coordinates/README_EN.md) | | Medium | 🔒 |
-| 2979 | [Most Expensive Item That Can Not Be Bought](/solution/2900-2999/2979.Most%20Expensive%20Item%20That%20Can%20Not%20Be%20Bought/README_EN.md) | | Medium | 🔒 |
-| 2980 | [Check if Bitwise OR Has Trailing Zeros](/solution/2900-2999/2980.Check%20if%20Bitwise%20OR%20Has%20Trailing%20Zeros/README_EN.md) | | Easy | Weekly Contest 378 |
-| 2981 | [Find Longest Special Substring That Occurs Thrice I](/solution/2900-2999/2981.Find%20Longest%20Special%20Substring%20That%20Occurs%20Thrice%20I/README_EN.md) | | Medium | Weekly Contest 378 |
-| 2982 | [Find Longest Special Substring That Occurs Thrice II](/solution/2900-2999/2982.Find%20Longest%20Special%20Substring%20That%20Occurs%20Thrice%20II/README_EN.md) | | Medium | Weekly Contest 378 |
-| 2983 | [Palindrome Rearrangement Queries](/solution/2900-2999/2983.Palindrome%20Rearrangement%20Queries/README_EN.md) | | Hard | Weekly Contest 378 |
-| 2984 | [Find Peak Calling Hours for Each City](/solution/2900-2999/2984.Find%20Peak%20Calling%20Hours%20for%20Each%20City/README_EN.md) | | Medium | 🔒 |
-| 2985 | [Calculate Compressed Mean](/solution/2900-2999/2985.Calculate%20Compressed%20Mean/README_EN.md) | | Easy | 🔒 |
-| 2986 | [Find Third Transaction](/solution/2900-2999/2986.Find%20Third%20Transaction/README_EN.md) | | Medium | 🔒 |
-| 2987 | [Find Expensive Cities](/solution/2900-2999/2987.Find%20Expensive%20Cities/README_EN.md) | | Easy | 🔒 |
-| 2988 | [Manager of the Largest Department](/solution/2900-2999/2988.Manager%20of%20the%20Largest%20Department/README_EN.md) | | Medium | 🔒 |
-| 2989 | [Class Performance](/solution/2900-2999/2989.Class%20Performance/README_EN.md) | | Medium | 🔒 |
-| 2990 | [Loan Types](/solution/2900-2999/2990.Loan%20Types/README_EN.md) | | Easy | 🔒 |
-| 2991 | [Top Three Wineries](/solution/2900-2999/2991.Top%20Three%20Wineries/README_EN.md) | | Hard | 🔒 |
+| 2969 | [Minimum Number of Coins for Fruits II](/solution/2900-2999/2969.Minimum%20Number%20of%20Coins%20for%20Fruits%20II/README_EN.md) | `Queue`,`Array`,`Dynamic Programming`,`Monotonic Queue`,`Heap (Priority Queue)` | Hard | 🔒 |
+| 2970 | [Count the Number of Incremovable Subarrays I](/solution/2900-2999/2970.Count%20the%20Number%20of%20Incremovable%20Subarrays%20I/README_EN.md) | `Array`,`Two Pointers`,`Binary Search`,`Enumeration` | Easy | Biweekly Contest 120 |
+| 2971 | [Find Polygon With the Largest Perimeter](/solution/2900-2999/2971.Find%20Polygon%20With%20the%20Largest%20Perimeter/README_EN.md) | `Greedy`,`Array`,`Prefix Sum`,`Sorting` | Medium | Biweekly Contest 120 |
+| 2972 | [Count the Number of Incremovable Subarrays II](/solution/2900-2999/2972.Count%20the%20Number%20of%20Incremovable%20Subarrays%20II/README_EN.md) | `Array`,`Two Pointers`,`Binary Search` | Hard | Biweekly Contest 120 |
+| 2973 | [Find Number of Coins to Place in Tree Nodes](/solution/2900-2999/2973.Find%20Number%20of%20Coins%20to%20Place%20in%20Tree%20Nodes/README_EN.md) | `Tree`,`Depth-First Search`,`Dynamic Programming`,`Sorting`,`Heap (Priority Queue)` | Hard | Biweekly Contest 120 |
+| 2974 | [Minimum Number Game](/solution/2900-2999/2974.Minimum%20Number%20Game/README_EN.md) | `Sort`,`Array`,`Simulation`,`Heap (Priority Queue)` | Easy | Weekly Contest 377 |
+| 2975 | [Maximum Square Area by Removing Fences From a Field](/solution/2900-2999/2975.Maximum%20Square%20Area%20by%20Removing%20Fences%20From%20a%20Field/README_EN.md) | `Array`,`Hash Table`,`Enumeration` | Medium | Weekly Contest 377 |
+| 2976 | [Minimum Cost to Convert String I](/solution/2900-2999/2976.Minimum%20Cost%20to%20Convert%20String%20I/README_EN.md) | `Graph`,`Array`,`String`,`Shortest Path` | Medium | Weekly Contest 377 |
+| 2977 | [Minimum Cost to Convert String II](/solution/2900-2999/2977.Minimum%20Cost%20to%20Convert%20String%20II/README_EN.md) | `Graph`,`Trie`,`Array`,`String`,`Dynamic Programming`,`Shortest Path` | Hard | Weekly Contest 377 |
+| 2978 | [Symmetric Coordinates](/solution/2900-2999/2978.Symmetric%20Coordinates/README_EN.md) | `Database` | Medium | 🔒 |
+| 2979 | [Most Expensive Item That Can Not Be Bought](/solution/2900-2999/2979.Most%20Expensive%20Item%20That%20Can%20Not%20Be%20Bought/README_EN.md) | `Math`,`Dynamic Programming`,`Number Theory` | Medium | 🔒 |
+| 2980 | [Check if Bitwise OR Has Trailing Zeros](/solution/2900-2999/2980.Check%20if%20Bitwise%20OR%20Has%20Trailing%20Zeros/README_EN.md) | `Bit Manipulation`,`Array` | Easy | Weekly Contest 378 |
+| 2981 | [Find Longest Special Substring That Occurs Thrice I](/solution/2900-2999/2981.Find%20Longest%20Special%20Substring%20That%20Occurs%20Thrice%20I/README_EN.md) | `Hash Table`,`String`,`Binary Search`,`Counting`,`Sliding Window` | Medium | Weekly Contest 378 |
+| 2982 | [Find Longest Special Substring That Occurs Thrice II](/solution/2900-2999/2982.Find%20Longest%20Special%20Substring%20That%20Occurs%20Thrice%20II/README_EN.md) | `Hash Table`,`String`,`Binary Search`,`Counting`,`Sliding Window` | Medium | Weekly Contest 378 |
+| 2983 | [Palindrome Rearrangement Queries](/solution/2900-2999/2983.Palindrome%20Rearrangement%20Queries/README_EN.md) | `Hash Table`,`String`,`Prefix Sum` | Hard | Weekly Contest 378 |
+| 2984 | [Find Peak Calling Hours for Each City](/solution/2900-2999/2984.Find%20Peak%20Calling%20Hours%20for%20Each%20City/README_EN.md) | `Database` | Medium | 🔒 |
+| 2985 | [Calculate Compressed Mean](/solution/2900-2999/2985.Calculate%20Compressed%20Mean/README_EN.md) | `Database` | Easy | 🔒 |
+| 2986 | [Find Third Transaction](/solution/2900-2999/2986.Find%20Third%20Transaction/README_EN.md) | `Database` | Medium | 🔒 |
+| 2987 | [Find Expensive Cities](/solution/2900-2999/2987.Find%20Expensive%20Cities/README_EN.md) | `Database` | Easy | 🔒 |
+| 2988 | [Manager of the Largest Department](/solution/2900-2999/2988.Manager%20of%20the%20Largest%20Department/README_EN.md) | `Database` | Medium | 🔒 |
+| 2989 | [Class Performance](/solution/2900-2999/2989.Class%20Performance/README_EN.md) | `Database` | Medium | 🔒 |
+| 2990 | [Loan Types](/solution/2900-2999/2990.Loan%20Types/README_EN.md) | `Database` | Easy | 🔒 |
+| 2991 | [Top Three Wineries](/solution/2900-2999/2991.Top%20Three%20Wineries/README_EN.md) | `Database` | Hard | 🔒 |
+| 2992 | [Number of Self-Divisible Permutations](/solution/2900-2999/2992.Number%20of%20Self-Divisible%20Permutations/README_EN.md) | | Medium | 🔒 |
## Copyright
diff --git a/solution/database-summary.md b/solution/database-summary.md
index ab1f1a0734e2b..3a400860c3939 100644
--- a/solution/database-summary.md
+++ b/solution/database-summary.md
@@ -238,11 +238,11 @@
- [2893.计算每个区间内的订单](/database-solution/2800-2899/2893.Calculate%20Orders%20Within%20Each%20Interval/README.md)
- [2922.市场分析 III](/database-solution/2900-2999/2922.Market%20Analysis%20III/README.md)
- [2978.Symmetric Coordinates](/database-solution/2900-2999/2978.Symmetric%20Coordinates/README.md)
- - [2984.Find Peak Calling Hours for Each City](/database-solution/2900-2999/2984.Find%20Peak%20Calling%20Hours%20for%20Each%20City/README.md)
- - [2985.Calculate Compressed Mean](/database-solution/2900-2999/2985.Calculate%20Compressed%20Mean/README.md)
- - [2986.Find Third Transaction](/database-solution/2900-2999/2986.Find%20Third%20Transaction/README.md)
- - [2987.Find Expensive Cities](/database-solution/2900-2999/2987.Find%20Expensive%20Cities/README.md)
- - [2988.Manager of the Largest Department](/database-solution/2900-2999/2988.Manager%20of%20the%20Largest%20Department/README.md)
+ - [2984.找到每座城市的高峰通话时间](/database-solution/2900-2999/2984.Find%20Peak%20Calling%20Hours%20for%20Each%20City/README.md)
+ - [2985.计算订单平均商品数量](/database-solution/2900-2999/2985.Calculate%20Compressed%20Mean/README.md)
+ - [2986.找到第三笔交易](/database-solution/2900-2999/2986.Find%20Third%20Transaction/README.md)
+ - [2987.寻找房价最贵的城市](/database-solution/2900-2999/2987.Find%20Expensive%20Cities/README.md)
+ - [2988.最大部门的经理](/database-solution/2900-2999/2988.Manager%20of%20the%20Largest%20Department/README.md)
- [2989.班级表现](/database-solution/2900-2999/2989.Class%20Performance/README.md)
- [2990.贷款类型](/database-solution/2900-2999/2990.Loan%20Types/README.md)
- [2991.最好的三家酒庄](/database-solution/2900-2999/2991.Top%20Three%20Wineries/README.md)
diff --git a/solution/summary.md b/solution/summary.md
index 4f31e3c8af5ed..1576dcda99727 100644
--- a/solution/summary.md
+++ b/solution/summary.md
@@ -3041,11 +3041,12 @@
- [2981.找出出现至少三次的最长特殊子字符串 I](/solution/2900-2999/2981.Find%20Longest%20Special%20Substring%20That%20Occurs%20Thrice%20I/README.md)
- [2982.找出出现至少三次的最长特殊子字符串 II](/solution/2900-2999/2982.Find%20Longest%20Special%20Substring%20That%20Occurs%20Thrice%20II/README.md)
- [2983.回文串重新排列查询](/solution/2900-2999/2983.Palindrome%20Rearrangement%20Queries/README.md)
- - [2984.Find Peak Calling Hours for Each City](/solution/2900-2999/2984.Find%20Peak%20Calling%20Hours%20for%20Each%20City/README.md)
- - [2985.Calculate Compressed Mean](/solution/2900-2999/2985.Calculate%20Compressed%20Mean/README.md)
- - [2986.Find Third Transaction](/solution/2900-2999/2986.Find%20Third%20Transaction/README.md)
- - [2987.Find Expensive Cities](/solution/2900-2999/2987.Find%20Expensive%20Cities/README.md)
- - [2988.Manager of the Largest Department](/solution/2900-2999/2988.Manager%20of%20the%20Largest%20Department/README.md)
+ - [2984.找到每座城市的高峰通话时间](/solution/2900-2999/2984.Find%20Peak%20Calling%20Hours%20for%20Each%20City/README.md)
+ - [2985.计算订单平均商品数量](/solution/2900-2999/2985.Calculate%20Compressed%20Mean/README.md)
+ - [2986.找到第三笔交易](/solution/2900-2999/2986.Find%20Third%20Transaction/README.md)
+ - [2987.寻找房价最贵的城市](/solution/2900-2999/2987.Find%20Expensive%20Cities/README.md)
+ - [2988.最大部门的经理](/solution/2900-2999/2988.Manager%20of%20the%20Largest%20Department/README.md)
- [2989.班级表现](/solution/2900-2999/2989.Class%20Performance/README.md)
- [2990.贷款类型](/solution/2900-2999/2990.Loan%20Types/README.md)
- [2991.最好的三家酒庄](/solution/2900-2999/2991.Top%20Three%20Wineries/README.md)
+ - [2992.Number of Self-Divisible Permutations](/solution/2900-2999/2992.Number%20of%20Self-Divisible%20Permutations/README.md)
diff --git a/solution/summary_en.md b/solution/summary_en.md
index d5924a8fc42c7..953d83ef6c6ba 100644
--- a/solution/summary_en.md
+++ b/solution/summary_en.md
@@ -3049,3 +3049,4 @@
- [2989.Class Performance](/solution/2900-2999/2989.Class%20Performance/README_EN.md)
- [2990.Loan Types](/solution/2900-2999/2990.Loan%20Types/README_EN.md)
- [2991.Top Three Wineries](/solution/2900-2999/2991.Top%20Three%20Wineries/README_EN.md)
+ - [2992.Number of Self-Divisible Permutations](/solution/2900-2999/2992.Number%20of%20Self-Divisible%20Permutations/README_EN.md)