前言:这是一场周赛的第四题,第二题也是类似的题目,但是这题不可以暴力,所以我们得用快速幂来优化,因为这题符合我们说的有递推公式,且递推的数量特别大,符合快速幂的使用条件
Mo = int(1e9)+7
def mul(a,b):
n = len(a)
m = len(b[0])
kk = len(a[0])
tmp = [[0]*m for _ in range(n)]
for i in range(n):
for j in range(m):
for k in range(kk):
tmp[i][j] += a[i][k]*b[k][j]
tmp[i][j] %= Mo
return tmp
# def mul(a: List[List[int]], b: List[List[int]]) -> List[List[int]]:
# return [[sum(x * y for x, y in zip(row, col)) % Mo for col in zip(*b)]
# for row in a]
def pow_mul(a,n,f):
res = f
while n:
if n&1:
res = mul(a,res)
a = mul(a,a)
n >>= 1
return res
class Solution:
def lengthAfterTransformations(self, s: str, t: int, nums: List[int]) -> int:
size = 26
f = [[1] for _ in range(size)]
m = [[0]*size for _ in range(size)]
for i,c in enumerate(nums):
for j in range(i+1,i+c+1):
m[i][j%size] = 1
mt = pow_mul(m,t,f)
ans = 0
ans = 0
for ch, cnt in Counter(s).items():
ans += mt[ord(ch) - ord('a')][0] * cnt
return ans%Mo
注意在矩阵运算的时候取模