File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
const lengthAfterTransformations = (s, t, nums) => {
2+
const MOD = 1000000007n
3+
const ALPHA = 26
4+
const codeA = 'a'.charCodeAt(0)
5+
6+
const initMatrix = () =>
7+
Array(ALPHA)
8+
.fill()
9+
.map(() => Array(ALPHA).fill(0n))
10+
11+
const base = initMatrix()
12+
nums.forEach((count, i) => {
13+
for (let k = 1; k <= count; k++) {
14+
base[i][(i + k) % ALPHA] += 1n
15+
}
16+
})
17+
18+
let counts = Array(ALPHA).fill(0n)
19+
20+
for (const ch of s) {
21+
counts[ch.charCodeAt(0) - codeA] += 1n
22+
}
23+
24+
const mulMatrix = (A, B) =>
25+
A.map((row, i) => row.map((_, j) => row.reduce((sum, v, k) => (sum + v * B[k][j]) % MOD, 0n)))
26+
27+
const mulVector = (vec, M) =>
28+
Array(ALPHA)
29+
.fill()
30+
.map((_, j) => vec.reduce((sum, vi, i) => (sum + vi * M[i][j]) % MOD, 0n))
31+
32+
let powerMat = base
33+
let exp = t
34+
35+
while (exp > 0) {
36+
if (exp & 1) {
37+
counts = mulVector(counts, powerMat)
38+
}
39+
powerMat = mulMatrix(powerMat, powerMat)
40+
exp >>= 1
41+
}
42+
43+
const result = counts.reduce((sum, cnt) => (sum + cnt) % MOD, 0n)
44+
return Number(result)
45+
}

0 commit comments

Comments
 (0)