LC 3272. 统计好整数的数目
https://leetcode.cn/problems/find-the-count-of-good-integers/description/
这题应该算是一个基本统计+排列组合
- 首先使用枚举方法找到所有可以被K整除的回文数,
- 然后找到这些回文数的特征,具体就是每个数字的数量是多少。
- 然后就是排列组合来求解。
最开始第三步我尝试枚举,但是这个肯定不行。想象一下如果k=1的话,那么所有的数都是满足的。另外就是这里n, k取值范围都比较小,最后提交的话可以打表,但是也没啥意思。
我这里计算特征可能有点搓,用了一个set来自做去重。感觉这里如果可以按照某种顺序搜索的话,应该是可以省略这个set的。最后计算排列组合的时候需要注意起始位置不能是0.
class Solution:
def countGoodIntegers(self, n: int, k: int) -> int:
ans = 0
opts = set()
import functools
@functools.cache
def C(n, m):
if m == 0: return 1
if n == m: return 1
return C(n - 1, m - 1) + C(n - 1, m)
def check(cnt):
ans = 1
base = n
if cnt[0] != 0:
ans *= C(base - 1, cnt[0])
base -= cnt[0]
for c in cnt[1:]:
if c != 0:
ans *= C(base, c)
base -= c
return ans
def dfs(i, now, cnt):
nonlocal ans
j = n - 1 - i
if j < i:
if now % k == 0:
cnt = tuple(cnt)
if cnt not in opts:
opts.add(cnt)
ans += check(cnt)
return
start = 1 if i == 0 else 0
bi, bj = 10 ** i, 10 ** j
for d in range(start, 10):
if i != j:
d2 = now + d * bi + d * bj
cnt[d] += 2
dfs(i + 1, d2, cnt)
cnt[d] -= 2
else:
d2 = now + d * bi
cnt[d] += 1
dfs(i + 1, d2, cnt)
cnt[d] -= 1
return
dfs(0, 0, [0] * 10)
return ans