Kick Start 2018

1. No Nine

Q: 求 [L, R] 的合法数字个数,合法数字是不能包含9也不能被9整除。L和R一定合法。
A:

  1. 自己的想法:区间内多少含有9的数字,多少9的倍数,多少又包含9又是9的倍数,分别计算出来。区间内如果不好求,就写一个函数,是[1,x]内的数字个数,然后[1,R]-[1,L]
  2. 官解:先把问题变成子问题,即上述的,把问题换成[1,N],则
res = count(R)-count(L)+1 # 因为L肯定是合法数字

count函数:(没有很看懂)

def count(N):
	res = 0
	L = len(str(N)
	for i,v in enumerate(str(N):
		if i < L - 1:
                        # int(v)是该位值,后面每位都有0-8共9个数字进行选择,除了最后一位。最后一位9个数字是连续的,必有一个数字可以被9整除,是不合法的。
			res += int(v) * (9 ** (L - 2 - i)) * 8 
		else:
			for i in range(N - N % 10, N + 1): # 最后一位
				if i % 9 > 0:
					res += 1
                        # 或者上面三行等同于下面一行
                        # res += N % 10 + (N % 9 > N % 10)
	return res
  1. DFS或DP

代码可参考:Code Jam Kickstart Round B 2018 题解

原文地址:https://www.cnblogs.com/xym4869/p/13235998.html