Digprime.py — различия между версиями

Материал из DISCOPAL
Перейти к: навигация, поиск
Строка 16: Строка 16:
 
next(tc_)
 
next(tc_)
  
 +
digits = 19
 +
p10 = [10**i for i in range(digits)]
  
 
   
 
   
 
def calculate(i, taken: int, ls: int) -> int:
 
def calculate(i, taken: int, ls: int) -> int:
 +
    '''
 +
    i — индекс цифры
 +
    taken — встречали ли простые цифры раньше
 +
    ls — в текущем индексе можно делать полный перебор
 +
    '''
 
     global input_str
 
     global input_str
 
     global dp
 
     global dp
Строка 25: Строка 32:
 
     if dp[i][taken][ls] != -1:
 
     if dp[i][taken][ls] != -1:
 
         return int(dp[i][taken][ls])
 
         return int(dp[i][taken][ls])
 +
 +
    if ls and taken:
 +
        return p10[len(input_str) - i]
 +
 
     res = 0
 
     res = 0
 
     if ls:
 
     if ls:

Версия 01:22, 1 мая 2022

# globals
import sys
 
input_str = ""
dp = [[[-1, -1], [-1, -1]] for i in range(25)]
 
 
def get_input():
    lines = sys.stdin.readlines()
    content = " ".join(lines).strip()
    for token in content.split():
        yield token
 
tc_ = get_input()
next(tc_)
 
digits = 19
p10 = [10**i for i in range(digits)]
 
 
def calculate(i, taken: int, ls: int) -> int:
    '''
    i — индекс цифры
    taken — встречали ли простые цифры раньше
    ls — в текущем индексе можно делать полный перебор
    '''
    global input_str
    global dp
    if i == len(input_str):
        return taken
    if dp[i][taken][ls] != -1:
        return int(dp[i][taken][ls])
 
    if ls and taken:
        return p10[len(input_str) - i]
 
    res = 0
    if ls:
        limit = 9
    else:
        limit = int(input_str[i])
    for x in range(limit + 1):
        res += calculate(i + 1, taken | (x == 2) | (x == 3) | (x == 5) | (x == 7), ls | (x != limit))
 
    dp[i][taken][ls] = int(res)
    return int(res)
 
 
for input_str in tc_:
    for j in range(25):
        dp[j][0][0] = -1
        dp[j][1][0] = -1
        dp[j][1][1] = -1
        dp[j][0][1] = -1
    print(calculate(0, 0, 0))