Top.Mail.Ru
Ответы

Помогите пожалуйста решить задачу срочно!!! всё, до чего додумался уже пытался, время превышает 1 секунду!!! Python

Ученые планируют провести важный эксперимент с использованием исследовательского модуля на планете X-2019. В процессе
эксперимента будет проведено два измерения: основное и контрольное. Каждое измерение занимает ровно один час и должно начинаться
спустя целое число часов после начала работы исследовательского модуля.
Данные эксперимента планируется немедленно передать на орбитальную станцию. Канал связи с орбитальной станцией будет установлен с
l-го по r-й час от начала работы исследовательского модуля, включительно. Кроме того, согласно плану эксперимента между измерениями
планета должна совершить целое число оборотов вокруг своей оси. Планета X-2019 осуществляет оборот вокруг своей оси за a часов.
Таким образом, если измерения осуществляются на i-м и j-м часу, то должно выполняться неравенство l <= i < j <= r , а величина (j - i) должна быть кратна a.
Теперь учёным необходимо понять, сколько существует различных способов провести измерения.
Требуется написать программу, которая по заданным границам времени измерений l и r и периоду обращения планеты вокруг своей оси a определяет количество возможных способов провести измерения: количество пар целых чисел i и j, таких что l <= i < j <= r, и величина (j - i)
кратна a.

Входные данные
(1 ≤ l < r ≤ 10**9, 1 ≤ a ≤ 10**9)

Выходные данные
Выведите одно целое число: количество способов провести измерения.

По дате
По рейтингу
Аватар пользователя
Новичок
9мес

У нас есть отрезок длины t = r - l и надо найти кол-во способов уложить внутри этого отрезка один отрезок длины k * a, где 1 <= k <= t // a.

Кол-во способов уложить отрезок длины k * a в отрезок длины t равно:
t + 1 - k * a

Получили банальную арифметической прогрессии из школьного учебника математики, содержащую t // a членов с первым членом t + 1 - a и последним членом t + 1 - (t // a) * a.

Но (t // a) * a = t - t % a и:
t + 1 - (t // a) * a = t + 1 - t + t % a = t % a + 1

Сумма прогрессии (школьный учебник математики):
S = (t // a) * (t + 1 - a + t % a + 1) // 2 = (t // a) * (t + t % a + 2 - a) // 2

Весь код:

123
 l, r, a = map(int, input().split()) # ввод поправишь под задачу
t = r - l
print((t // a) * (t + t % a + 2 - a) // 2) 

БЕЗ циклов.

Аватар пользователя
Просветленный
9мес
12345678910111213141516171819202122232425262728293031323334353637383940414243
 def count_measurements(l: int, r: int, a: int) -> int: 
    # Количество пар (i, j) 
    count = 0 
 
    # Для каждого i от l до r-1 
    for i in range(l, r): 
        # Находим первое j такое, что j = i + k * a 
        # j <= r, значит k = (r - i) // a 
        next_j = i + a - (i % a) if i % a != 0 else i + a 
         
        # Если j лежит в пределах допустимого диапазона 
        if next_j <= r: 
            count += (r - next_j) // a + 1 
     
    return count 
 
# Тесты с для проверки корректности функции
def test_count_measurements(): 
    # Пример из задачи 
    assert count_measurements(5, 12, 3) == 4, "Тест 1 не пройден" 
     
    # Тест: минимальные значения 
    assert count_measurements(1, 2, 1) == 1, "Тест 2 не пройден" 
     
    # Тест: большой диапазон, кратно a 
    assert count_measurements(1, 10, 2) == 4, "Тест 3 не пройден" 
     
    # Тест: все значения возможны 
    assert count_measurements(1, 6, 1) == 10, "Тест 4 не пройден" 
     
    # Тест: a больше диапазона (невозможно сделать измерения) 
    assert count_measurements(5, 10, 7) == 0, "Тест 5 не пройден" 
     
    # Тест: случай с большим диапазоном и большим значением a 
    assert count_measurements(100000000, 100000005, 2) == 2, "Тест 6 не пройден" 
     
    # Тест: значения l и r ближе к максимальному диапазону 
    assert count_measurements(999999995, 1000000000, 2) == 3, "Тест 7 не пройден" 
 
# Запуск тестов 
test_count_measurements() 
print("Все тесты пройдены!")