1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar, Union from sys import exit, setrecursionlimit, stdin from string import ascii_lowercase, ascii_uppercase from math import ceil, comb, fabs, floor, gcd, hypot, log, perm, sqrt from itertools import combinations, compress, permutations, starmap, tee from heapq import heapify, heappop, heappush, nlargest, nsmallest from functools import lru_cache, reduce from datetime import datetime, timedelta from collections import Counter, defaultdict, deque import random
TYPE = TypeVar('TYPE') N = int(2e5 + 10) M = int(20) INF = int(1e12) OFFSET = int(100) MOD = int(1e9 + 7)
setrecursionlimit(int(2e9))
class Arr: array = staticmethod(lambda x=0, size=N: [x() if callable(x) else x for _ in range(size)]) array2d = staticmethod(lambda x=0, rows=N, cols=M: [Arr.array(x, cols) for _ in range(rows)]) graph = staticmethod(lambda size=N: [[] for _ in range(size)])
class Math: max = staticmethod(lambda a, b: a if a > b else b) min = staticmethod(lambda a, b: a if a < b else b)
class IO: input = staticmethod(lambda: stdin.readline().rstrip("\r\n")) read = staticmethod(lambda: map(int, IO.input().split())) read_list = staticmethod(lambda: list(IO.read()))
class Std: pass
class Solution: def countDigitOne(self, n: int) -> int:
s = str(n)
@lru_cache(None) def dfs(i, cnt, is_limit, is_num): if i == len(s): return cnt res = 0 if not is_num: res = dfs(i + 1, cnt, False, False)
up = int(s[i]) if is_limit else 9 down = 0 if is_num else 1
for d in range(down, up + 1): res += dfs(i + 1, cnt + (d == 1), is_limit and d == up, True) return res
return dfs(0, 0, True, False)
|