1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| MOD = 10**9 + 7
states = [] idx = {} for s0 in range(3): for s1 in range(3): for s2 in range(3): for t0 in range(3): st = (s0,s1,s2,t0) idx[st] = len(states) states.append(st) N = len(states) assert N == 81
def next_state(st, digit): s0,s1,s2,t0 = st x = digit % 3 s = [s0,s1,s2] sprime = [ (s[(k - x) % 3] + (1 if x == k else 0)) % 3 for k in range(3) ] t0p = (t0 + sprime[0]) % 3 return (sprime[0], sprime[1], sprime[2], t0p)
def build_M(): M = [[0]*N for _ in range(N)] for j, st in enumerate(states): for d in range(10): stp = next_state(st, d) i = idx[stp] M[i][j] = (M[i][j] + 1) % MOD return M
def mat_mult(A, B): p = len(A); q = len(A[0]); r = len(B[0]) C = [[0]*r for _ in range(p)] for i in range(p): Ai = A[i] Ci = C[i] for k in range(q): aik = Ai[k] if aik == 0: continue Bk = B[k] mul = aik for j in range(r): Ci[j] = (Ci[j] + mul * Bk[j]) % MOD return C
def mat_vec_mult(A, v): p = len(A); q = len(A[0]) res = [0]*p for i in range(p): s = 0 Ai = A[i] for j in range(q): s = (s + Ai[j] * v[j]) % MOD res[i] = s return res
def mat_pow(M, e): def identity(n): I = [[0]*n for _ in range(n)] for i in range(n): I[i][i] = 1 return I result = identity(N) base = [row[:] for row in M] while e > 0: if e & 1: result = mat_mult(base, result) base = mat_mult(base, base) e >>= 1 return result
M = build_M()
v1 = [0]*N for d in range(1,10): st = (0,0,0,0) stp = next_state(st, d) v1[idx[stp]] = (v1[idx[stp]] + 1) % MOD
def F(d): if d == 1: return sum(v1[i] for i,st in enumerate(states) if st[3] == 0) % MOD Mp = mat_pow(M, d-1) vd = mat_vec_mult(Mp, v1) ans = 0 for i, st in enumerate(states): if st[3] == 0: ans = (ans + vd[i]) % MOD return ans
print("F(2) =", F(2)) print("F(6) =", F(6))
d = 10**5 print("F(10^5) mod 1e9+7 =", F(d))
|