Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 10.12.2023
Сообщений: 1

Найти наибольшее натуральное число x меньшее k такое что x!+(x−1)! кратно числу k

26.11.2024, 22:57. Показов 2996. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ограничение по времени на тест 1s.
Ограничение по памяти на тест 256 MB.
Вам дано натуральное число k. Найдите наибольшее натуральное число x , где 1≤x<k , такое, что x!+(x−1)!† кратно числу k, или определите, что такого x не существует.
y! обозначает факториал числа y: 0!=1 , а для y≥1 факториал задаётся рекуррентно: y!=y⋅(y−1)!. Например, 5!=5⋅4⋅3⋅2⋅1⋅0!=120
.

Входные данные
Первая строка содержит одно целое число t (1≤t≤104) — количество наборов входных данных. Далее следует описание наборов.
Единственная строка каждого набора входных данных содержит одно целое число k (2≤k≤109).

Выходные данные
Для каждого набора входных данных выведите одно целое число — наибольшее возможное натуральное число x , удовлетворяющее условиям выше. Если такого x не существует, выведите −1
.
Вот мое решение:
C++
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
#include <iostream>
using namespace std;
 
// Функция для нахождения наибольшего x для данного k
int find_largest_x(int k) {
    // Проверяем x от k-1 до 1
    for (int x = k - 1; x >= 1; --x) {
        long long factorial_x = 1, factorial_x_minus_1 = 1;
 
        // Вычисляем x! % k
        for (int i = 1; i <= x; ++i) {
            factorial_x = (factorial_x * i) % k;
        }
        
        // Вычисляем (x-1)! % k
        for (int i = 1; i < x; ++i) {
            factorial_x_minus_1 = (factorial_x_minus_1 * i) % k;
        }
        
        // Проверяем условие
        if ((factorial_x + factorial_x_minus_1) % k == 0) {
            return x; // Возвращаем x, если условие выполнено
        }
    }
    return -1; // Если такого x нет
}
 
int main() {
    int t; // Количество тестов
    cin >> t;
 
    while (t--) {
        int k;
        cin >> k;
 
        // Вывод результата для текущего k
        cout << find_largest_x(k) << endl;
    }
 
    return 0;
}
Превышено ограничение времени на тесте 2.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.11.2024, 22:57
Ответы с готовыми решениями:

Определить что, данное натуральное число а кратно числу Ь, но не кратно числу с
помогите нарисовать блок схему к этой программе вот код программы var Form1: TForm1; a,b,c:integer; implementation {$R...

Определить, что натуральное число a кратно числу b, но не кратно числу c.
Составить программу, печатающую значение true, если указанное высказывание является истин-ным, и false в противном случае, когда данное...

Найти наименьшее натуральное число Q такое, что произведение его цифр равно заданному числу N
Требуется найти наименьшее натуральное число Q такое, что произведение его цифр равно заданному числу N. Входные данные В...

40
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
27.11.2024, 11:00
Студворк — интернет-сервис помощи студентам

Не по теме:


Royal_X, не 108, а k - 1. И если уж придираться, то решать нужно именно с крестом x!+(x−1)!† кратно числу k.
0
27.11.2024, 11:11

Не по теме:

Долой двойные стандарты! (не успел отредактировать предыдущее сообщение)

0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,377
27.11.2024, 11:58
Цитата Сообщение от KSergey9 Посмотреть сообщение
либо (x−1)! должно содержать множитель k, но такого быть не может, т.к. для этого x должен быть равен k+1, но x строго меньше k по условию,
Вот этой мысли я не понял. Вернее понял, он логику проследить не могу? Откуда такие выводы?
k=6, x=5 и все условия соблюдаются.
Но общий ходы мыслей думаю верный, надо разбивать на множители и их по отдельности кратным искать
0
27.11.2024, 14:28

Не по теме:

Цитата Сообщение от gunslinger Посмотреть сообщение
не 108, а k - 1.
верно. Я просто изначально не заметил, что k вводится с клавы.

0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,377
27.11.2024, 19:19
А у меня тут мысль родилась.... вот смотрите
x!+(x−1)! кратно k и x<k

то есть (x−1)! * (x + 1) кратно k должно быть и х максималный.
Максимальный х который меньше k это k-1. Подставляем

((k-1)-1)!*(k-1+1) упростим
(k-2)!*k и это выражение кратно k так как один из множителей k.

Все. Не надо ничего перебирать в цикле.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6701 / 3120 / 1064
Регистрация: 01.06.2021
Сообщений: 12,047
27.11.2024, 19:28
Цитата Сообщение от Alex1126 Посмотреть сообщение
Не надо ничего перебирать в цикле.
Вообще, респект, что местные форумчане рассмотрели математическую составляющую задачи.

Однако, задача опубликована не в разделе математики, а программирования. К тому же, из условия вытекает, что ее нужно решать не математически, а путем написания кода. Мне кажется, что сам составитель задачи был в курсе математического решения. Например, встречаются же задачи типа посчитать сумму натуральных чисел до числа n с помощью цикла. И составитель задачи есесена тоже в курсе, что сумму можно посчитать по формуле, но тем не менее, он просит посчитать с помощью цикла, ибо цель задачи - научить новичков юзать циклы. Тут возможно то же самое.

эта фраза тоже намекает, что задача имеет учебные цели
Цитата Сообщение от 11lamer11 Посмотреть сообщение
факториал задаётся рекуррентно
цель этой задачи, наверняка, научить пользоваться рекурсией, циклами, делать проверки и прочее, а не жульничать математикой.
0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,377
27.11.2024, 19:32
Цитата Сообщение от Royal_X Посмотреть сообщение
факториал задаётся рекуррентно
это фраза относится к описанию что такое факториал
Цитата Сообщение от Royal_X Посмотреть сообщение
цель этой задачи, наверняка, научить пользоваться рекурсией, циклами, делать проверки и прочее, а не жульничать математикой.
Ну факториал то все равно посчитать надо. А вот в тупую считать в цикле факториал для 10^9 это как то не задача для новичков

Но в целом верно. Нужен код. Сейчас, перекушу и наваяю
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6701 / 3120 / 1064
Регистрация: 01.06.2021
Сообщений: 12,047
27.11.2024, 19:37
Цитата Сообщение от Alex1126 Посмотреть сообщение
это фраза относится к описанию что такое факториал
в математике обычно факториал описывают произведением. Рекуррентная формула больше используется в программировании, нежели в математике. Причем, в учебном программировании.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
27.11.2024, 20:15
Цитата Сообщение от Alex1126 Посмотреть сообщение
Все. Не надо ничего перебирать в цикле.
Дык об этом я и написал выше.

Цитата Сообщение от Royal_X Посмотреть сообщение
К тому же, из условия вытекает, что ее нужно решать не математически, а путем написания кода.
Факториал 109 не посчитать так-то уже, это не говоря про 10^9.
При этом учитывая, что в пачке 10^4 входных чисел и время 1 сек - без вариантов ваще, по-моему

Добавлено через 1 минуту
PS
А еще мне мерещилось, что в вопросе была приписка "курс теории вычислений" или что-то такое, но сейчас не нашел, наверное в другой теме какой-то попадалось
0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,377
27.11.2024, 20:26
Цитата Сообщение от KSergey9 Посмотреть сообщение
Дык об этом я и написал выше.
А впринципе это ни на что не влияет. Так же в цикле вычисляем, первое же значение подходит.
Цитата Сообщение от KSergey9 Посмотреть сообщение
При этом учитывая, что в пачке 10^4 входных чисел и время 1 сек - без вариантов ваще, по-моему
а вот тут да, там не всегда даже одно решение находится за такое время, а уж про 10^4 и говорить нечего
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
27.11.2024, 20:36
Цитата Сообщение от Alex1126 Посмотреть сообщение
Так же в цикле вычисляем, первое же значение подходит
В каком цикле?
0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,377
27.11.2024, 20:54
C++
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
#include <iostream>
using namespace std;
 
long arr_fact[1000]; //массив со значениями факториалов, на саммо деле его нужно делать размером 10^9 
int f;
 
long fact(long x) {
    if (x>f) { // такой факториал еще не подсчитан, считаем
        for (int i=f;i<x+1;i++) {
            arr_fact[i]=arr_fact[i-1]*i;
        }
        f=x;
    }
    return arr_fact[x];
}
 
// Функция для нахождения наибольшего x для данного k
int find_largest_x(int k) {
    // Проверяем x от k-1 до 1
    for (int x = k - 1; x >= 1; --x) {
 
        // Проверяем условие
        if ((arr_fact[x] + arr_fact[x-1]) % k == 0) {
            return x; // Возвращаем x, если условие выполнено
        }
    }
    return -1; // Если такого x нет
}
 
int main() {
    arr_fact[0]=1; // проинициализируем факториал нуля
    f=0; // значение для которого подсчитан факториал
 
    int t; // Количество тестов
    cin >> t;
 
    while (t--) {
        int k;
        cin >>k;        
 
        // Вывод результата для текущего k
        cout << find_largest_x(k) << endl;
    }
 
    return 0;
}
факториал считается по мере необходимости и запоминается в массиве. Массив возможно можно и в функции обьявить как static но вроде во времени доступа проиграем (хотя выиграем в размере стека). На какую память 256 ограничение? Сумарно? Тогда так. Можно поиграться с типами переменных, может побыстрей чего будет. Но в секунду не уложимся по любому, если только вообще все вычисления факториалов убирать
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
27.11.2024, 21:06
Цитата Сообщение от Alex1126 Посмотреть сообщение
//массив со значениями факториалов
массив на 1000 элементов, тип элемента:
Цитата Сообщение от Alex1126 Посмотреть сообщение
long
Эта... хотел смайлик какой-нибудь поставить. Но не буду


PS
Я тут вчера с удивлением узнал, что факториал 12-ти .. 13-ти - это уже за 10^9
Про 1000 я и не говорю
0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,377
27.11.2024, 21:06
Цитата Сообщение от KSergey9 Посмотреть сообщение
В каком цикле?
когда перебираем x
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
27.11.2024, 21:08
Цитата Сообщение от Alex1126 Посмотреть сообщение
когда перебираем x
Зачем?! уже же найдено аналитическое решение, без всяких факториалов и переборов.
0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,377
27.11.2024, 21:10
Цитата Сообщение от KSergey9 Посмотреть сообщение
Про 1000 я и не говорю
ну этот момент обсуждали уже. Да, есть косяк. Я поэтому и подписал что бы понятно было

Добавлено через 2 минуты
Цитата Сообщение от KSergey9 Посмотреть сообщение
Зачем?! уже же найдено аналитическое решение, без всяких факториалов и подборов.
Ну нам же нужно, по условиям задачи, за 1 секунду занять 256 мегабайт памяти )))))
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
27.11.2024, 21:13
Цитата Сообщение от Alex1126 Посмотреть сообщение
Ну нам же нужно занять 256 мегабайт памяти
Неужели программа "Hello, World!" из-под современного компилятора всё еще меньше 256 мегабайт памяти занимает?! недоработочка, однако!
0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,377
27.11.2024, 21:45
Цитата Сообщение от KSergey9 Посмотреть сообщение
Неужели программа "Hello, World!" из-под современного компилятора всё еще меньше 256 мегабайт памяти занимает?! недоработочка, однако!
поэтому программа и не выводит никаких сообщений типа "введите k", а то не хватит нам памяти то
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
27.11.2024, 22:02
Цитата Сообщение от Alex1126 Посмотреть сообщение
(k-2)!*k и это выражение кратно k так как один из множителей k.
Не совсем верно. Имеем (x−1)! * (x + 1) =k пусть х+1=k отсюда х=k-1.
Поверяем 1) к=6 х=5 подставляем в формулу 5!+(5-1)!=120+24=144 или 144/6=24
2) k=9 x=8 или 8!+(8-1)!=40320+5040=45360 или 45360/9=5040
3) k=12 х=11 или 11!+(11-1)!=39916800+3628800=43545600/12=3628800
0
451 / 176 / 29
Регистрация: 12.12.2020
Сообщений: 1,377
27.11.2024, 22:07
Цитата Сообщение от повар1 Посмотреть сообщение
Не совсем верно. Имеем (x−1)! * (x + 1) =k пусть х+1=k отсюда х=k-1.
Поверяем 1) к=6 х=5 подставляем в формулу 5!+(5-1)!=120+24=144 или 144/6=24
2) k=9 x=8 или 8!+(8-1)!=40320+5040=45360 или 45360/9=5040
3) k=12 х=11 или 11!+(11-1)!=39916800+3628800=43545600/12=3628800
ну так где же "не совсем верно"? вроде все верно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.11.2024, 22:07

Найти наименьшее натуральное число Q такое, что произведение его цифр равно заданному числу N
Можете пожалуйста проверить правильно ли записан код на JAVA Условие: Найти наименьшее натуральное число Q такое, что произведение...

Найти наименьшее натуральное число такое, что произведение его цифр равно заданному числу
Требуется найти наименьшее натуральное число Q такое, что произведение его цифр равно заданному числу N. Входные данные: В...

Найти наименьшее натуральное число Q такое, что произведение его цифр равно заданному числу N
Требуется найти наименьшее натуральное число Q такое, что произведение его цифр равно заданному числу N. Входные данные В...

Требуется найти наименьшее натуральное число Q такое, что произведение его цифр равно заданному числу N
Здравствуйте, помогите решить задачу. Требуется найти наименьшее натуральное число Q такое, что произведение его цифр равно заданному...

Дано натуральное число N. Получить наибольшее число вида 4k, меньшее N
Помогите решить, заранее спасибо)) 1. Дано натуральное число N. Получить наибольшее число вида 4k, меньшее N. зараннее спасибо)))


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru