diff --git a/solutions/0788.dominatingNambers/README.md b/solutions/0788.dominatingNambers/README.md new file mode 100644 index 0000000..1d9ac3f --- /dev/null +++ b/solutions/0788.dominatingNambers/README.md @@ -0,0 +1,2 @@ +核心思想是n位数中,n/2个数是相同的数量。 +这就可以转化为一个组合的问题。由此延展成为解法。 diff --git a/solutions/0788.dominatingNambers/euler_788.py b/solutions/0788.dominatingNambers/euler_788.py new file mode 100644 index 0000000..9de4761 --- /dev/null +++ b/solutions/0788.dominatingNambers/euler_788.py @@ -0,0 +1,66 @@ +""" +A dominating number is a positive integer that has more than half of its digits equal. + +For example, 2022is a dominating number because three of its four digits are equal to 2. But +2021 is not a dominating number. + +Let D(N) be how many dominating numbers are less than 10^N . +For example, D(4)=603 and D(10)=21893256 . + +Find D(2022). Give your answer modulo 1_000_000_007. +""" + +import time + + +def timer(func): + def wrapper(*args, **kwargs): + start_time = time.time() + result = func(*args, **kwargs) + end_time = time.time() + elapsed_time = end_time - start_time + print(f"{func.__name__} time: {elapsed_time:.6f} seconds") + return result + + return wrapper + + +@timer +def solve(N: int = 2022, MOD: int = 10**9 + 7): + # 预处理阶乘和逆阶乘到 N+1 + fact = [1] * (N + 2) + for i in range(1, N + 2): + fact[i] = fact[i - 1] * i % MOD + + inv_fact = [1] * (N + 2) + inv_fact[N + 1] = pow(fact[N + 1], MOD - 2, MOD) + for i in range(N, -1, -1): + inv_fact[i] = inv_fact[i + 1] * (i + 1) % MOD + + # 组合数函数 + def C(n: int, k: int) -> int: + if k < 0 or k > n: + return 0 + return fact[n] * inv_fact[k] % MOD * inv_fact[n - k] % MOD + + # 预处理 9 的幂(到 N+2 足够) + pow9 = [1] * (N + 3) + for i in range(1, N + 3): + pow9[i] = pow9[i - 1] * 9 % MOD + + ans = 0 + K_max = (N - 1) // 2 + for k in range(0, K_max + 1): + term = pow9[k + 1] * (C(N + 1, k + 1) - C(2 * k + 1, k + 1)) % MOD + ans = (ans + term) % MOD + return ans + + +def main(): + n = int(input("N:")) + mod = int(input("mod:") or (10**9 + 7)) + print(solve(n, mod)) + + +if __name__ == "__main__": + main()