Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/48: Рейтинг темы: голосов - 48, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 22

Интересные числа

30.05.2022, 20:24. Показов 10390. Ответов 10

Студворк — интернет-сервис помощи студентам
Софья считает число интересным, если его цифры идут в неубывающем порядке. Например, числа 123, 1111 или 888999 – интересные.

Софья заинтересовалась, сколько существует интересных положительных чисел, лежащих в диапазоне от L до R включительно. Это число может оказаться довольно большим для больших L и R, поэтому Софья хочет найти остаток от деления этого числа на 10^9 + 7.

Требуется написать программу, которая по заданным L и R определяет количество интересных чисел, лежащих в диапазоне от L до R включительно, и выводит остаток от деления этого числа на 10^9 + 7.

Просто перебор не проходит по времени

Пример
1
100

Вывести
54
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.05.2022, 20:24
Ответы с готовыми решениями:

Интересные числа
Любознательный Артем заинтересовался есть ли такие числа, что сумма кубов цифр равна самому числу. Оказалось, что такие числа есть. К...

Интересные числа
Софья считает число интересным, если его цифры идут в неубывающем порядке. Например, числа 123, 1111 или 888999 — интересные. Требуется...

Задача 5: Интересные числа
Задача 5: Интересные числа На занятиях математического кружка Сережа узнал об интересных числах — это числа, которые имеют простые...

10
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
30.05.2022, 21:07
Цитата Сообщение от KiraBush Посмотреть сообщение
Вывести
54
не похоже, что это уже после деления на 10^9 + 7

Добавлено через 41 секунду
брутфорс вот так

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def is_non_descreasing(n):
    str_n = str(n)
    for idx in range(len(str_n)-1):
        if str_n[idx] > str_n[idx+1]:
            return False
    return True
 
L = int(input('L: '))
R = int(input('R: '))
 
counter = 0
for num in range(L, R+1):
    if is_non_descreasing(num):
        counter += 1
 
print(counter/(10**9 + 7))
но если нужен ответ 54, то просто
Python
1
print(counter)
Добавлено через 3 минуты
Цитата Сообщение от KiraBush Посмотреть сообщение
Просто перебор не проходит по времени
сильно не проходит

Добавлено через 11 минут
без строк

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def is_non_descreasing(n):
    prev = None
    while n > 0:
        rem = n % 10
        if prev != None and rem > prev:
            return False
        n //= 10
        prev = rem
    return True
 
L = int(input('L: '))
R = int(input('R: '))
 
counter = 0
for num in range(L, R+1):
    if is_non_descreasing(num):
        counter += 1
 
print(counter)
0
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 22
30.05.2022, 21:16  [ТС]
Там деление остатком. По времени тоже не пройдет, перебор опять всех чисел от L до R
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
31.05.2022, 05:09
Большие куски можно отрезать вот так, из-за того, что каждая цифра числа должна быть хотя бы равна первой, но как полностью описать последовательность математически я не знаю.

Python
1
2
3
4
5
6
7
8
def is_non_descreasing(n):
    str_n = str(n)
    if n < int(str_n[0]*len(str_n)):
        return False
    for idx in range(len(str_n)-1):
        if str_n[idx] > str_n[idx+1]:
            return False
    return True
Хотя нет, это скорее замедлит код, чем убыстрит. И предполагаю, что деление быстрее строкового перебора символов.

Добавлено через 2 часа 48 минут
Подумал еще немного, почитал формулы и последовательности. Рассчитать кол-во неубывающих чисел для всех n-значных чисел можно посчитать через биномиальный коэффициент, плюс добавить все неубывающие от L до ближайшей степени 10ки и от степени 10 до R.

то есть для 50, 10050 нужно будет посчитать неубывающих от 50 до 100, биномиальный коэффициент для 3 значных чисел и 4 значных чисел, и неубывающих от 10000 до 10050.

попробовал на диапазоне от 1 до 111222333 (сто одиннадцать миллионов + значений).

перебором через остаток от деления - 49 секунд
через биномиальный коэффициент - 0.05 секунд.

Python
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
from math import ceil, comb, floor, log10
import time
 
def is_non_decreasing(n):
    prev = None
    while n > 0:
        rem = n % 10
        if prev != None and rem > prev:
            return False
        n //= 10
        prev = rem
    return True
 
def round_up(n):
    return 10**(ceil(log10(n)))
 
def round_down(n):
    return int(pow(10, floor(log10(n))))
 
def n_digits(n):
    counter = 0
    while n > 0:
        n //= 10
        counter += 1
    return counter
 
def digits(n1, n2):
    return range(n_digits(n1), n_digits(n2))
 
def bin_coeff(n):
    N = n+8
    return comb(N, 8) # Binomial Coefficient
 
L = int(input('L: '))
R = int(input('R: '))
 
# ===== v1 =====
start_time = time.time()
ru = round_up(L)
rd = round_down(R)
digs = digits(ru, rd)
 
counter = 0
for x in range(L, ru):
    if is_non_decreasing(x):
        counter += 1
 
srd = str(rd)
for x in range(int(srd[0]*len(srd)), R+1):
    if is_non_decreasing(x):
        counter += 1
 
for d in digs:
    counter += bin_coeff(d)
print(f'v1 (binom_coeff): {(time.time() - start_time)}, nums: {counter}')
# ===== v1 =====
 
# ===== v2 =====
start_time = time.time()
 
counter = 0
for num in range(L, R+1):
    if is_non_decreasing(num):
        counter += 1
 
print(f'v2 (brute force): {(time.time() - start_time)}, nums: {counter}')
# ===== v2 =====
Code
1
2
3
4
5
python thread2987504.py
L: 1
R: 111222333
v1 (binom_coeff): 0.054473161697387695, nums: 25633
v2 (brute force): 49.476454973220825, nums: 25633
0
Эксперт Python
8850 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
31.05.2022, 10:39
Jabbson, R до 10**100...
https://informatics.msk.ru/mod... rid=113102
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
31.05.2022, 15:08
Динамическое программирование

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
L = input()
R = input()
 
a = [[0 for _ in range(10)] for _ in range(len(R)+1)]
a[0][0] = 1
 
for k in range(1, len(R)+1):
    for i in range(10):
        a[k][i] = sum(a[k-1][j] for j in range(i+1))
       
def f(n, k):
    if len(n) == 1: return max(int(n[0]) - k + 1, 0)
    return max(int(n[0]) - k, 0) * sum( [a[len(n) - 1][i] for i in range (0, 10-k)] ) + f(n[1:], max(int(n[0]), k))
 
print (f(R,0) - f(str(int(L)-1),0))
Добавлено через 10 минут
a[i][j] - число неубывающих последовательностей длины i, оканчивающихся на j.
f(n,k) - количество интересных чисел с минимальной цифрой, не меньшей k.
0
Эксперт Python
8850 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
31.05.2022, 15:58
Red white socks, где то ошибка (по модулю учел)
Идея та же:
Python
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
def fun(num, lst):
    d = list(map(int,str(num)))
    k = len(d)
    cnt = lst[-1][d[0]-1]
 
    for i in range(k-2):
        if d[i+1] >= d[i]:
            cnt += lst[-i-2][d[i+1]-1] - lst[-i-2][d[i]-1]
        else:
            return cnt
    
    if k > 1:
        if d[-1] >= d[-2]:
            cnt += d[k-1] - d[k-2] + 1
    else:
        cnt = d[k-1]
    
    return cnt
 
 
def d_sum(num):
    k = len(str(num))
    a = [1]*9
    res = [[0] + a]
 
    for i in range(1, k):
        for j in range(8):
            a[j+1] += a[j]
        res.append([(a[-1]+res[-1][0])])
        for j in range(8):
            res[i].append((res[i][-1] + a[8-j]))
    
    return res
    
    
L = int(input())
R = int(input())
 
print((fun(R, d_sum(R)) - fun(L-1, d_sum(L)))%(int(1e9) + 7))
1
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
31.05.2022, 16:06
Gdez, у меня или у вас?

Добавлено через 4 минуты
Gdez, вполне возможно, что и у меня, функцию f я конструировал выливанием воды из чайника. Надо как-то поизящнее, но это уже только вечером после работы
0
Эксперт Python
8850 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
31.05.2022, 16:08
Red white socks,
у меня или у вас?
У Вас
По ссылке тестировщик...
1
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
31.05.2022, 20:25
Лучший ответ Сообщение было отмечено Aael как решение

Решение

Gdez, спасибо, попробую зарегаться

Добавлено через 4 часа 11 минут
Исправил опечатку, заодно избавился от рекурсии
Python
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
L = input()
R = input()
p = 10 ** 9 + 7 
 
s=len(R)
a = [[0 for _ in range(10)] for _ in range(s+1)]
a[0][0] = 1
 
for k in range(1, s+1):
    for i in range(10):
        a[k][i] = sum(a[k-1][j] for j in range(i+1))
 
def f(n):
 
    res, min_num = 0, 0
    for i, j in enumerate(n):
        j = int(j)
        if j < min_num: 
            return res
        elif j > min_num:
            res += sum(a[len(n)-i][9-x] for x in range(min_num, j))
            min_num = j
    return res + 1
 
print ((f(R) - f(str(int(L)-1))) % p)
5
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
01.06.2022, 20:23
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from functools import lru_cache
 
@lru_cache 
def comb(n, k, mod): # math.comb(n, k)
    return 1 if k == 0 or k == n else \
        (comb(n-1, k-1, mod) + comb(n-1, k, mod)) % mod
 
def nondec_before(n: str, inclusive: bool, mod, base = 10):
    r, m = 0, 0
    for k, c in enumerate(map(int,n), 1):
        if c < m: return r % mod
        t = len(n)-k # число цифр справа от k'ой
        r += sum(comb(t+base-d-1, t, mod) for d in range(m, c))
        m = c
    return (r + int(inclusive)) % mod
 
p = 10**9 + 7
l, r = input(), input()
print((nondec_before(r, inclusive=True, mod=p) - \
       nondec_before(l, inclusive=False, mod=p)) % p)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.06.2022, 20:23
Помогаю со студенческими работами здесь

Задача 5: Интересные числа
Задача 5: Интересные числа На занятиях математического кружка Сережа узнал об интересных числах — это числа, которые имеют простые...

Напишите программу, которая все интересные места, что видели в Англии, Франции и над Ла-Маншем, запишет в файл.
Ограничение времени 1 секунда Ограничение памяти 64Mb Ввод стандартный ввод или input.txt Вывод observations.json – Глядите:...

Интересные задачи! Попробуйте )
На столе лежит набор карт, на которых записаны очки. Некоторые карты могут повторяться. Для того, чтобы победить, нужно набрать как можно...

Интересные задачи на Python
1) Реализовать класс Matrix (матрица). Обеспечить перегрузку конструктора класса (метод __init__()), который должен принимать данные...

Интересные ресурсы для питонистов
В этой теме я хотел бы собрать онлайн-ресурсы, которые могут помочь начинающему, продолжающему или даже преуспевающему питонисту оттачивать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru