Skip to content

feat: add solutions to lc problem: No.0935 #3819

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
551 changes: 431 additions & 120 deletions solution/0900-0999/0935.Knight Dialer/README.md

Large diffs are not rendered by default.

608 changes: 492 additions & 116 deletions solution/0900-0999/0935.Knight Dialer/README_EN.md

Large diffs are not rendered by default.

34 changes: 15 additions & 19 deletions solution/0900-0999/0935.Knight Dialer/Solution.cpp
Original file line number Diff line number Diff line change
@@ -1,25 +1,21 @@
using ll = long long;

class Solution {
public:
int knightDialer(int n) {
if (n == 1) return 10;
int mod = 1e9 + 7;
vector<ll> f(10, 1ll);
const int mod = 1e9 + 7;
vector<long long> f(10, 1);
while (--n) {
vector<ll> t(10);
t[0] = f[4] + f[6];
t[1] = f[6] + f[8];
t[2] = f[7] + f[9];
t[3] = f[4] + f[8];
t[4] = f[0] + f[3] + f[9];
t[6] = f[0] + f[1] + f[7];
t[7] = f[2] + f[6];
t[8] = f[1] + f[3];
t[9] = f[2] + f[4];
for (int i = 0; i < 10; ++i) f[i] = t[i] % mod;
vector<long long> g(10);
g[0] = (f[4] + f[6]) % mod;
g[1] = (f[6] + f[8]) % mod;
g[2] = (f[7] + f[9]) % mod;
g[3] = (f[4] + f[8]) % mod;
g[4] = (f[0] + f[3] + f[9]) % mod;
g[6] = (f[0] + f[1] + f[7]) % mod;
g[7] = (f[2] + f[6]) % mod;
g[8] = (f[1] + f[3]) % mod;
g[9] = (f[2] + f[4]) % mod;
f = g;
}
ll ans = accumulate(f.begin(), f.end(), 0ll);
return (int) (ans % mod);
return accumulate(f.begin(), f.end(), 0LL) % mod;
}
};
};
37 changes: 19 additions & 18 deletions solution/0900-0999/0935.Knight Dialer/Solution.cs
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@
public class Solution {
public int KnightDialer(int n) {
if (n == 1) return 10;
int A = 4;
int B = 2;
int C = 2;
int D = 1;
int MOD = (int)1e9 + 7;
for (int i = 0; i < n - 1; i++) {
int tempA = A;
int tempB = B;
int tempC = C;
int tempD = D;
A = ((2 * tempB) % MOD + (2 * tempC) % MOD) % MOD;
B = tempA;
C = (tempA + (2 * tempD) % MOD) % MOD;
D = tempC;
const int mod = 1000000007;
long[] f = new long[10];
for (int i = 0; i < 10; i++) {
f[i] = 1;
}

int ans = (A + B) % MOD;
ans = (ans + C) % MOD;
return (ans + D) % MOD;
while (--n > 0) {
long[] g = new long[10];
g[0] = (f[4] + f[6]) % mod;
g[1] = (f[6] + f[8]) % mod;
g[2] = (f[7] + f[9]) % mod;
g[3] = (f[4] + f[8]) % mod;
g[4] = (f[0] + f[3] + f[9]) % mod;
g[6] = (f[0] + f[1] + f[7]) % mod;
g[7] = (f[2] + f[6]) % mod;
g[8] = (f[1] + f[3]) % mod;
g[9] = (f[2] + f[4]) % mod;
f = g;
}

return (int)(f.Sum() % mod);
}
}
40 changes: 17 additions & 23 deletions solution/0900-0999/0935.Knight Dialer/Solution.go
Original file line number Diff line number Diff line change
@@ -1,30 +1,24 @@
func knightDialer(n int) int {
if n == 1 {
return 10
}
func knightDialer(n int) (ans int) {
f := make([]int, 10)
for i := range f {
f[i] = 1
}
mod := int(1e9) + 7
const mod int = 1e9 + 7
for i := 1; i < n; i++ {
t := make([]int, 10)
t[0] = f[4] + f[6]
t[1] = f[6] + f[8]
t[2] = f[7] + f[9]
t[3] = f[4] + f[8]
t[4] = f[0] + f[3] + f[9]
t[6] = f[0] + f[1] + f[7]
t[7] = f[2] + f[6]
t[8] = f[1] + f[3]
t[9] = f[2] + f[4]
for j, v := range t {
f[j] = v % mod
}
g := make([]int, 10)
g[0] = (f[4] + f[6]) % mod
g[1] = (f[6] + f[8]) % mod
g[2] = (f[7] + f[9]) % mod
g[3] = (f[4] + f[8]) % mod
g[4] = (f[0] + f[3] + f[9]) % mod
g[6] = (f[0] + f[1] + f[7]) % mod
g[7] = (f[2] + f[6]) % mod
g[8] = (f[1] + f[3]) % mod
g[9] = (f[2] + f[4]) % mod
f = g
}
ans := 0
for _, v := range f {
ans = (ans + v) % mod
for _, x := range f {
ans = (ans + x) % mod
}
return ans
}
return
}
38 changes: 14 additions & 24 deletions solution/0900-0999/0935.Knight Dialer/Solution.java
Original file line number Diff line number Diff line change
@@ -1,31 +1,21 @@
class Solution {
private static final int MOD = (int) 1e9 + 7;

public int knightDialer(int n) {
if (n == 1) {
return 10;
}
final int mod = (int) 1e9 + 7;
long[] f = new long[10];
Arrays.fill(f, 1);
while (--n > 0) {
long[] t = new long[10];
t[0] = f[4] + f[6];
t[1] = f[6] + f[8];
t[2] = f[7] + f[9];
t[3] = f[4] + f[8];
t[4] = f[0] + f[3] + f[9];
t[6] = f[0] + f[1] + f[7];
t[7] = f[2] + f[6];
t[8] = f[1] + f[3];
t[9] = f[2] + f[4];
for (int i = 0; i < 10; ++i) {
f[i] = t[i] % MOD;
}
}
long ans = 0;
for (long v : f) {
ans = (ans + v) % MOD;
long[] g = new long[10];
g[0] = (f[4] + f[6]) % mod;
g[1] = (f[6] + f[8]) % mod;
g[2] = (f[7] + f[9]) % mod;
g[3] = (f[4] + f[8]) % mod;
g[4] = (f[0] + f[3] + f[9]) % mod;
g[6] = (f[0] + f[1] + f[7]) % mod;
g[7] = (f[2] + f[6]) % mod;
g[8] = (f[1] + f[3]) % mod;
g[9] = (f[2] + f[4]) % mod;
f = g;
}
return (int) ans;
return (int) (Arrays.stream(f).sum() % mod);
}
}
}
26 changes: 12 additions & 14 deletions solution/0900-0999/0935.Knight Dialer/Solution.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
class Solution:
def knightDialer(self, n: int) -> int:
if n == 1:
return 10
f = [1] * 10
for _ in range(n - 1):
t = [0] * 10
t[0] = f[4] + f[6]
t[1] = f[6] + f[8]
t[2] = f[7] + f[9]
t[3] = f[4] + f[8]
t[4] = f[0] + f[3] + f[9]
t[6] = f[0] + f[1] + f[7]
t[7] = f[2] + f[6]
t[8] = f[1] + f[3]
t[9] = f[2] + f[4]
f = t
return sum(t) % (10**9 + 7)
g = [0] * 10
g[0] = f[4] + f[6]
g[1] = f[6] + f[8]
g[2] = f[7] + f[9]
g[3] = f[4] + f[8]
g[4] = f[0] + f[3] + f[9]
g[6] = f[0] + f[1] + f[7]
g[7] = f[2] + f[6]
g[8] = f[1] + f[3]
g[9] = f[2] + f[4]
f = g
return sum(f) % (10**9 + 7)
46 changes: 46 additions & 0 deletions solution/0900-0999/0935.Knight Dialer/Solution2.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
class Solution {
public:
int knightDialer(int n) {
const int mod = 1e9 + 7;
vector<vector<int>> base = {
{0, 0, 0, 0, 1, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 1},
{0, 0, 0, 0, 1, 0, 0, 0, 1, 0},
{1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 1, 0, 0, 0, 0, 0}};
vector<vector<int>> res = pow(base, n - 1, mod);
return accumulate(res[0].begin(), res[0].end(), 0LL) % mod;
}

private:
vector<vector<int>> mul(const vector<vector<int>>& a, const vector<vector<int>>& b, int mod) {
int m = a.size(), n = b[0].size();
vector<vector<int>> c(m, vector<int>(n, 0));
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] = (c[i][j] + (1LL * a[i][k] * b[k][j]) % mod) % mod;
}
}
}
return c;
}

vector<vector<int>> pow(vector<vector<int>>& a, int n, int mod) {
int size = a.size();
vector<vector<int>> res(1, vector<int>(size, 1));
while (n > 0) {
if (n % 2 == 1) {
res = mul(res, a, mod);
}
a = mul(a, a, mod);
n /= 2;
}
return res;
}
};
60 changes: 60 additions & 0 deletions solution/0900-0999/0935.Knight Dialer/Solution2.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
public class Solution {
private const int mod = 1000000007;
private readonly int[][] baseMatrix = {
new int[] {0, 0, 0, 0, 1, 0, 1, 0, 0, 0},
new int[] {0, 0, 0, 0, 0, 0, 1, 0, 1, 0},
new int[] {0, 0, 0, 0, 0, 0, 0, 1, 0, 1},
new int[] {0, 0, 0, 0, 1, 0, 0, 0, 1, 0},
new int[] {1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
new int[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
new int[] {1, 1, 0, 0, 0, 0, 0, 1, 0, 0},
new int[] {0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
new int[] {0, 1, 0, 1, 0, 0, 0, 0, 0, 0},
new int[] {0, 0, 1, 0, 1, 0, 0, 0, 0, 0}
};

public int KnightDialer(int n) {
int[][] res = Pow(baseMatrix, n - 1);
int ans = 0;
foreach (var x in res[0]) {
ans = (ans + x) % mod;
}
return ans;
}

private int[][] Mul(int[][] a, int[][] b) {
int m = a.Length, n = b[0].Length;
int[][] c = new int[m][];
for (int i = 0; i < m; i++) {
c[i] = new int[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] = (int)((c[i][j] + (long)a[i][k] * b[k][j]) % mod);
}
}
}
return c;
}

private int[][] Pow(int[][] a, int n) {
int size = a.Length;
int[][] res = new int[1][];
res[0] = new int[size];
for (int i = 0; i < size; i++) {
res[0][i] = 1;
}

while (n > 0) {
if (n % 2 == 1) {
res = Mul(res, a);
}
a = Mul(a, a);
n /= 2;
}

return res;
}
}
59 changes: 59 additions & 0 deletions solution/0900-0999/0935.Knight Dialer/Solution2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
const mod = 1e9 + 7

func knightDialer(n int) int {
base := [][]int{
{0, 0, 0, 0, 1, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 1},
{0, 0, 0, 0, 1, 0, 0, 0, 1, 0},
{1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
}

res := pow(base, n-1)
ans := 0
for _, x := range res[0] {
ans = (ans + x) % mod
}
return ans
}

func mul(a, b [][]int) [][]int {
m := len(a)
n := 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] = (c[i][j] + a[i][k]*b[k][j]) % mod
}
}
}
return c
}

func pow(a [][]int, n int) [][]int {
size := len(a)
res := make([][]int, 1)
res[0] = make([]int, size)
for i := 0; i < size; i++ {
res[0][i] = 1
}

for n > 0 {
if n%2 == 1 {
res = mul(res, a)
}
a = mul(a, a)
n /= 2
}

return res
}
Loading
Loading