def get_multi_dimensional_list(v, *args): """ :param v:初期値 :param args:各次元のサイズ :return:多次元のリスト """ import copy res = v if args: if isinstance(v, list): res = [copy.deepcopy(v) for i in range(args[-1])] else: res = [v] * args[-1] if len(args) > 1: return get_multi_dimensional_list(res, *args[:-1]) return res def solve(): A, B = input().split() L = max(len(A), len(B)) A = (("0" * (L + 1)) + A)[-L - 1:] B = (("0" * (L + 1)) + B)[-L - 1:] dp = get_multi_dimensional_list(0, L + 2, 2, 2, 2, 3, 8) print(dp) dp[0][0][0][0][0][0] = 1 for i in range(L + 1): # 桁 for j in range(2): # A for k in range(2): # B for l in range(2): # 3がつくか for m in range(3): # 3の余り for n in range(8): # 8の余り a_i = int(A[i]) b_i = int(B[i]) lim_l = 0 if j else a_i lim_r = 9 if k else b_i if lim_l > lim_r: continue for number in range(lim_l, lim_r + 1): new_j = 1 if j or number > lim_l else 0 new_k = 1 if k or number < lim_r else 0 new_l = 1 if l or number == 3 else 0 new_m = (m * 10 + number) % 3 new_n = (n * 10 + number) % 8 dp[i + 1][new_j][new_k][new_l][new_m][new_n] += dp[i][j][k][l][m][n] % (10e9 + 7) res = 0 # 3がつく for i in range(2): for j in range(2): for m in range(3): res += sum(dp[L + 1][i][j][1][m][1:]) % (10e9 + 7) # 3の倍数 res += sum(dp[L + 1][i][j][0][0][1:]) % (10e9 + 7) print(int(res % (10e9 + 7))) solve()