defcalculate_d_n(N, MOD): # 1. 快速幂 defpower(a, b): res = 1 a %= MOD while b > 0: if b % 2 == 1: res = (res * a) % MOD a = (a * a) % MOD b //= 2 return res
# 2. 模逆元 defmodInverse(n): return power(n, MOD - 2)
# 3. 预计算阶乘和阶乘逆元 fact = [1] * (N + 1) invfact = [1] * (N + 1) for i inrange(2, N + 1): fact[i] = (fact[i - 1] * i) % MOD invfact[N] = modInverse(fact[N]) for i inrange(N - 1, 1, -1): invfact[i] = (invfact[i + 1] * (i + 1)) % MOD
# 4. 预计算9的幂 pow9 = [1] * (N + 1) for i inrange(1, N + 1): pow9[i] = (pow9[i - 1] * 9) % MOD
# 5. 组合数函数 defcombinations(n, k): if k < 0or k > n: return0 if k == 0or k == n: return1 if fact[n] == 0: # 应该不会发生 return0 num = fact[n] den = (invfact[k] * invfact[n - k]) % MOD return (num * den) % MOD
# --------------------------------- # 主计算 # --------------------------------- total_D_N = 0 # i = 长度 (从 1 到 N) for i inrange(1, N + 1): # A(i) = 9 * sum( C(i,j) * 9^(i-j) ) current_A_i = 0 # j = 支配数字的个数 # j 从 floor(i/2) + 1 开始 start_j = (i // 2) + 1 for j inrange(start_j, i + 1): # C(i, j) comb = combinations(i, j) # 9^(i-j) p9 = pow9[i - j] term = (comb * p9) % MOD current_A_i = (current_A_i + term) % MOD # A(i) = 9 * sum(...) current_A_i = (current_A_i * 9) % MOD # D(N) = D(N-1) + A(i) total_D_N = (total_D_N + current_A_i) % MOD return total_D_N
# --- 运行 --- N = 2022 MOD = 1000000007
result = calculate_d_n(N, MOD) print(f"D({N}) mod {MOD} = {result}")