Тема 25. Программирование - Обработка целочисленной информации
25.05 Прочие прототипы
Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела программирование - обработка целочисленной информации
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#37827

Тимофей любит число 7  и все числа кратные 999983.

Вопрос — где первое вхождение кратного K (K = 999983)  в последовательности 7,77,777,...  ? Если последовательность не содержит кратных 999983  , в ответе вместо этого запишите − 1  .

Показать ответ и решение

Поскольку i  -й член данной последовательности можно записать в виде 7⋅(1+ 10+ 102 + 103 + ⋅⋅⋅+ 10(i−1))  , посчитаем сумму геометрической прогрессии, поэтому искомым ответом является минимальное натуральное число i  , такое что 7 ⋅(10i − 1)  делится на 9K  . Если K  кратно 7  , вы можете рассмотреть, делится ли 10i− 1  на 9K∕∕7  вместо этого и в противном случае вы можете рассмотреть, делится ли   i
10 − 1  на 9K  . Поэтому давайте определим целое число L  таким образом, что L = 9K ∕7  если K  кратно 7  или L = 9K  в противном случае. Теперь достаточно найти минимальное натуральное число i такое, что 10i − 1  делится на L  , т. е. такое что остаток от деления 10i  на L  равен 1  . Если L  кратно 2  , то 10i  кратно 2  для любого положительного целого числа i  , поэтому его остаток деленное на L  никогда не будет равно 1  . То же самое относится, когда L  кратно 5  . Если ни одно из них не выполняется, то по теореме Эйлера выполняется 10φ(L ) ≡ 1  (mod L  ).

Поэтому, вам достаточно рассмотреть лишь подсчитать функцию эйлера за   √ --
O(  N)  и проверить все делители её значения. Потому что фактически в задаче вас просят найти показатель числа 10  по модулю L  .

Заметьте, что, не прибегая к приведенному выше математическому наблюдению, вы можете предположить, что «если ответ не равен − 1  , тогда ответ будет довольно маленьким;

Маленьким значит не более 9 ⋅K  . Поэтому вы можете рассмотреть первые 9K  значений.

Поэтому фактически в задаче всего лишь требуется подсчитать сумму геометрической прогрессии и написать перебор

Решение на С++

void solve() {
    int K;
    K = 999983;
    int cur = 10;
    for(int i = 0; i < 9 * K; ++i){
        if(7 * (cur - 1) % (9 * K) == 0){
            cout << i + 1 << "\n";
            return 0;
        }
        cur = (cur * 10) % (9 * K);
    }
    cout << "-1\n";
    return 0;
}

 

Решение на Python

k = 999983
ans = -1
s = 7
for i in range(10 ** 6):
    if s % k == 0:
        ans = i + 1
        break
    s = s * 10 + 7
print(ans)

Ответ: 999982

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное обучение
в Школково

Для детей ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Брянской областей, а также школьникам, находящимся в пунктах временного размещения Крыма обучение на платформе бесплатное.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ или олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!