Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202
1

Найти max количество подряд идущих элементов последовательности, которые делятся на одно и то же натуральное число

19.07.2021, 13:31. Показов 5161. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Забавная игра
Вы с друзьями играете в следующую игру. Друзья пишут на доске подряд N натуральных чисел. Ваша задача — найти как можно больше подряд идущих чисел, которые бы делились на одно и то же число, большее 1. Так как вручную искать ответ сложно, вы решили написать программу, которая сделает работу за вас.

Входные данные

В первой строке входных данных задано число N(1 ≤ N ≤ 100000). Во второй строке записано через пробел N целых чисел A1...AN(1 ≤ Ai ≤ 1000, 1 ≤ i ≤ N). Это те самые числа, которые написали ваши друзья. Они даны в том же порядке, в котором они расположены на доске.

Выходные данные

Ваша программа должна вывести одно целое число — наибольшее количество подряд идущих чисел заданной последовательности, которые бы делились на одно и то же натуральное число, большее 1.

Примеры
Ввод
3
6 10 15
Dsdjl
2
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.07.2021, 13:31
Ответы с готовыми решениями:

Найти как можно больше подряд идущих чисел, которые бы делились на одно и то же число, большее 1.
Вот условие: Забавная игра Вы с друзьями играете в следующую игру. Друзья пишут на доске подряд N...

Найти количество простых элементов последовательности идущих подряд
В задаче надо найти количество целых элементов,идущих подряд и составных элементов,так же идущих...

Найти максимальное число идущих подряд равных элементов последовательности
Дана последовательность натуральных чисел, завершающаяся числом 0. Определите, какое наибольшее...

Найти в последовательности, количество пар подряд идущих отрицательных элементов
Задача звучит так: Найти в последовательности чисел, заданных пользователем с клавиатуры,...

20
Диссидент
Эксперт C
 Аватар для Байт
27710 / 17328 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
19.07.2021, 14:02 2
dmitrii2000, находить НОД умеете? Двух чисел? Нескольких?

Добавлено через 1 минуту
Старайтесь соблюдать правило 4.7
0
 Аватар для LegionK
393 / 263 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
19.07.2021, 18:49 3
Цитата Сообщение от Байт Посмотреть сообщение
находить НОД умеете? Двух чисел? Нескольких?
Боюсь не поможет.

dmitrii2000, вроде можно за n*log*log решить, если написать бинарный поиск по ответу + дерево отрезков на нод.

А можно перебрать все простые числа до 1000, их около 100, и для каждого числа найти максимальный отрезок, в котором каждый элемент делится на это число. Потом выбрать наибольший и вывести. Это уровень ЕГЭ, вы справитесь. Нет, код я вам не отправлю, мне это неинтересно писать.
1
Диссидент
Эксперт C
 Аватар для Байт
27710 / 17328 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
19.07.2021, 22:37 4
Цитата Сообщение от LegionK Посмотреть сообщение
Боюсь не поможет.
почему же? Если бы ТС ответил на мой вопрос, мы бы с ним с грехом пополам набросали бы простенький код. И моя цель - заставить его немножко попытаться думать своей головой, а не ждать готового решения. Помочь, научить - рад. Делать за него - не интересно.
С вами полностью солидарен.
0
2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202
20.07.2021, 13:38  [ТС] 5
Скиньте код пожалуйста
0
Диссидент
Эксперт C
 Аватар для Байт
27710 / 17328 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
20.07.2021, 13:59 6
Цитата Сообщение от dmitrii2000 Посмотреть сообщение
Скиньте код пожалуйста
У меня его просто нет. Чтобы скинуть, надо его сначала создать. А зачем мне это?
0
2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202
20.07.2021, 14:22  [ТС] 7
Помогите пожалуйста код не проходит по времени
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <map> 
#include <string>
#include <math.h>
#include <deque>
using namespace std;
typedef long long ll;
ll n, x, c, ans;
vector<ll> a;
ll gcd(ll a, ll b) {
    while (b != 0) {
        a %= b;
        swap(a, b);
    }
    return a;
}
int main() {
    cin >> n;
    ans = -1;
    for (ll i = 0; i < n; i++) {
        cin >> x;
        a.push_back(x);
    }
    for (ll i = 0; i < n; i++) {
        c = a[i];
        for (ll j = i + 1; j < n;j++) {
            c = gcd(c, a[j]);
            if (c == 1) {
                ans = max(ans, j - i);
                break;
            }
        }
        if (c!=1) ans = max(ans, n-i);
    }
    cout << ans;
}
0
Диссидент
Эксперт C
 Аватар для Байт
27710 / 17328 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
20.07.2021, 16:55 8
Цитата Сообщение от dmitrii2000 Посмотреть сообщение
typedef long long ll;
Это зачем? Числа в задаче совсем не большие. Достаточно int

Добавлено через 9 минут
Код, похоже, рабочий. Сам писал?
Но слишком лобовой. Тут потоньше надо...

Добавлено через 2 часа 16 минут
Один из путей оптимизации кодаЖ
Во внешнем цикле пропускать a[i], взаимно простые с те, которое нарушило делимость....
Все равно от них ничего хорошего ждать не приходится...
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8564 / 4412 / 1655
Регистрация: 01.02.2015
Сообщений: 13,710
Записей в блоге: 9
05.08.2021, 08:25 9
Что то пришла в голову мысль:
1. в массиве искать НОД двух соседних чисел массива и тут же перезаписывать (заменять элемент на НОД) массив, который при этом уменьшится на 1 элемент.
2. операцию повторять пока все элементы массива не станут равны 1 или до сокращения длины массива до 1.
3. количество итераций и будет ответом.
4. для оптимизации пропускать элементы с 1, сокращать массив слева и справа при равенстве элементов 1.
1
Диссидент
Эксперт C
 Аватар для Байт
27710 / 17328 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
05.08.2021, 12:23 10
[quote="ФедосеевПавел;15650702"]Что то пришла в голову мысль[/quoto(e]Мысль интересная, но это, имхо, O(n2) как минимум
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8564 / 4412 / 1655
Регистрация: 01.02.2015
Сообщений: 13,710
Записей в блоге: 9
05.08.2021, 13:27 11
Да, похоже, у меня не лучший вариант. А других собственных пока и нет.

Согласен с LegionK - можно воспользоваться ограниченным диапазоном элементов массива
Цитата Сообщение от LegionK Посмотреть сообщение
перебрать все простые числа до 1000, их около 100, и для каждого числа найти максимальный отрезок, в котором каждый элемент делится на это число. Потом выбрать наибольший и вывести
А вот вторую идею не понял
Цитата Сообщение от LegionK Посмотреть сообщение
бинарный поиск по ответу + дерево отрезков на нод
0
Диссидент
Эксперт C
 Аватар для Байт
27710 / 17328 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
05.08.2021, 14:55 12
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
А других собственных пока и нет.
Согласен. Мой - тоже не шибко хорош
0
 Аватар для LegionK
393 / 263 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
16.08.2021, 18:20 13
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
А вот вторую идею не понял
Если все числа из подотрезка l...r делятся на какое-то число большее 1, то это значит, что нод всех элементов из этого отрезка будет больше единицы. Такой отрезок пусть назовем хорошим.

Т.к если в массиве присутствует хороший отрезок длины k, то будут присутствовать и все отрезки длины 1,2,...k-1, (хотя бы как подотрезки этого подотрезка). Соответственно если обозначить функцию f(t) как "присутствует ли хороший отрезок длины t в массиве", то для значений t от 1 до n значения f(t) будут : 1, 1, 1, 1, 1....,1, 0, 0, 0, 0, 0...... Вот ту последнюю единицу нам и надо найти. Сделать это можно при помощи бинарного поиска. Всё что осталось - написать функцию f. То есть уметь проверять, есть ли у нас в массиве хороший подотрезок нужной длины.

Пусть нам дано число k и нужно проверить, есть ли хороший отрезок длины k. Можно идти по массиву слева направо и для каждого i проверять, подходит ли нам отрезок i...i+k при помощи дерева отрезков на нод.

Ну в целом всё. Для данной задачи это излишне и асимптотика будет n*log*log*log. Это >= n*1000, но это все равно на порядок-два меньше, чем n*n.

Решается эта задача как я написал выше про простые числа. Не хотел вам отвечать потому что идея эта здесь ненужная и заметил я это просто так, но недавно увидел задачу сводящуюся к этой, а именно к вот этому методу (а не первому, потому что нету ограничения такого маленького на сами числа массива) и подумал, что вам, может быть, будет все же интересно. Вот задача https://codeforces.com/contest/1549/problem/D
чтобы решение посмотреть в правом нижнем углу "разбор задач". Там предлагается вместо дерева отрезков использовать разреженную таблицу, чтобы от одного логарифма в произведении избавиться, но я эту структуру не знаю.
1
Диссидент
Эксперт C
 Аватар для Байт
27710 / 17328 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
16.08.2021, 21:56 14
LegionK, Если я вас правильно понял, основная идея, заключается в том, что вы ищите Хороший отрезок дли N, при неудаче, длины N/2, дальше N/4 или 3N/4. И так далее...
Или я не врубаюсь?
0
 Аватар для LegionK
393 / 263 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
17.08.2021, 02:10 15
Байт, Да, как обычный бинарный поиск.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12812 / 6684 / 1800
Регистрация: 18.10.2014
Сообщений: 16,935
17.08.2021, 05:31 16
Цитата Сообщение от dmitrii2000 Посмотреть сообщение
Во второй строке записано через пробел N целых чисел A1...AN(1 ≤ Ai ≤ 1000, 1 ≤ i ≤ N)
Сразу ясно, что в качестве делителей нужно рассматривать только простые числа. В указанном димпазоне простых чисел немного. В чем проблема найти самый длинный отрезок делимости за один проход лобовым алгоримом? К чему тут какой-то бинарный поиск? Чего в чем?

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
47
48
49
50
51
52
53
#include <iostream>
 
int main() 
{
  struct { const unsigned p; unsigned n; } primes[] = 
  {
    {   2 }, {   3 }, {   5 }, {   7 }, {  11 }, {  13 }, {  17 }, {  19 }, 
    {  23 }, {  29 }, {  31 }, {  37 }, {  41 }, {  43 }, {  47 }, {  53 }, 
    {  59 }, {  61 }, {  67 }, {  71 }, {  73 }, {  79 }, {  83 }, {  89 }, 
    {  97 }, { 101 }, { 103 }, { 107 }, { 109 }, { 113 }, { 127 }, { 131 }, 
    { 137 }, { 139 }, { 149 }, { 151 }, { 157 }, { 163 }, { 167 }, { 173 }, 
    { 179 }, { 181 }, { 191 }, { 193 }, { 197 }, { 199 }, { 211 }, { 223 }, 
    { 227 }, { 229 }, { 233 }, { 239 }, { 241 }, { 251 }, { 257 }, { 263 }, 
    { 269 }, { 271 }, { 277 }, { 281 }, { 283 }, { 293 }, { 307 }, { 311 }, 
    { 313 }, { 317 }, { 331 }, { 337 }, { 347 }, { 349 }, { 353 }, { 359 }, 
    { 367 }, { 373 }, { 379 }, { 383 }, { 389 }, { 397 }, { 401 }, { 409 }, 
    { 419 }, { 421 }, { 431 }, { 433 }, { 439 }, { 443 }, { 449 }, { 457 }, 
    { 461 }, { 463 }, { 467 }, { 479 }, { 487 }, { 491 }, { 499 }, { 503 }, 
    { 509 }, { 521 }, { 523 }, { 541 }, { 547 }, { 557 }, { 563 }, { 569 }, 
    { 571 }, { 577 }, { 587 }, { 593 }, { 599 }, { 601 }, { 607 }, { 613 }, 
    { 617 }, { 619 }, { 631 }, { 641 }, { 643 }, { 647 }, { 653 }, { 659 }, 
    { 661 }, { 673 }, { 677 }, { 683 }, { 691 }, { 701 }, { 709 }, { 719 }, 
    { 727 }, { 733 }, { 739 }, { 743 }, { 751 }, { 757 }, { 761 }, { 769 }, 
    { 773 }, { 787 }, { 797 }, { 809 }, { 811 }, { 821 }, { 823 }, { 827 }, 
    { 829 }, { 839 }, { 853 }, { 857 }, { 859 }, { 863 }, { 877 }, { 881 }, 
    { 883 }, { 887 }, { 907 }, { 911 }, { 919 }, { 929 }, { 937 }, { 941 }, 
    { 947 }, { 953 }, { 967 }, { 971 }, { 977 }, { 983 }, { 991 }, { 997 } 
  }; 
 
  unsigned n = 0;
  std::cin >> n;
 
  unsigned m = 0;
 
  for (; n > 0; --n)
  {
    unsigned i = 0;
    std::cin >> i;
 
    for (auto &p : primes)
    {
      if (p.p > i)
        break;
 
      if (i % p.p != 0)
        p.n = 0;
      else if (++p.n > m)
        m = p.n;
    }
  }
 
  std::cout << m << std::endl;
}
0
 Аватар для LegionK
393 / 263 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
17.08.2021, 09:29 17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Сразу ясно, что в качестве делителей нужно рассматривать только простые числа. В указанном димпазоне простых чисел немного. В чем проблема найти самый длинный отрезок делимости за один проход лобовым алгоримом?
Цитата Сообщение от LegionK Посмотреть сообщение
А можно перебрать все простые числа до 1000, их около 100, и для каждого числа найти максимальный отрезок, в котором каждый элемент делится на это число. Потом выбрать наибольший и вывести
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
К чему тут какой-то бинарный поиск?
Цитата Сообщение от LegionK Посмотреть сообщение
Не хотел вам отвечать потому что идея эта здесь ненужная и заметил я это просто так, но недавно увидел задачу сводящуюся к этой, а именно к вот этому методу (а не первому, потому что нету ограничения такого маленького на сами числа массива) и подумал, что вам, может быть, будет все же интересно
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Чего в чем?
Цитата Сообщение от LegionK Посмотреть сообщение
бинарный поиск по ответу
...
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12812 / 6684 / 1800
Регистрация: 18.10.2014
Сообщений: 16,935
17.08.2021, 17:56 18
Цитата Сообщение от LegionK Посмотреть сообщение
бинарный поиск по ответу
По-прежнему не увидел в этой последовательности фраз ответа на свои вопросы: К чему тут какой-то бинарный поиск? Чего в чем?

Бинарный поиск производится по упорядоченной последовательности. Где здесь упорядоченная проследовательность? Упорядоченная проследовательность чего и как она упорядочена?
0
 Аватар для LegionK
393 / 263 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
17.08.2021, 18:02 19
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
По-прежнему не увидел в этой последовательности фраз ответа на свои вопросы
Я вам соболезную. Очень трагичная новость. Хотя никак не пойму почему мне должно быть не все равно, что кто-то не умеет читать, но я вам все равно соболезную на всякий случай.
0
TheCalligrapher
17.08.2021, 18:07     Найти max количество подряд идущих элементов последовательности, которые делятся на одно и то же натуральное число
  #20

Не по теме:

Цитата Сообщение от LegionK Посмотреть сообщение
Я вам соболезную. Очень трагичная новость. Хотя никак не пойму почему мне должно быть не все равно, что кто-то не умеет читать, но я вам все равно соболезную на всякий случай.
^^^ А, ну то есть это просто тролль, народ, который просто заваливает форум шлаком. Это тоже результат.

0
17.08.2021, 18:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2021, 18:07
Помогаю со студенческими работами здесь

Найти максимальное количество элементов последовательности, идущих подряд и являющихся простыми числами
условие В последовательности целых чисел найти максимальное количество чисел, идущих подряд,...

Даны натуральное число n, символы s1,...,sn. Выяснить,верно ли,что в последовательности s1,...,sn имеются пять идущих подряд букв е
даны натуральное число n, символы s1,...,sn. Выяснить,верно ли,что в последовательности s1,...,sn...

Дано натуральное число. Определить количество нулей, идущих подряд в младших разрядах
Дано натуральное число N(n&gt;9). Определить количество нулей. идущих подряд в младших разрядах...

Найти количество и сумму тех членов последовательности, которые делятся на 5 и не делятся на 7
Здравствуйте, никак не могу разобраться с задачей, помогите пожалуйста выполнить данную задачу на...

Найти количество и сумму тех членов последовательности, которые делятся на 5 и не делятся на 7
дано n и последовательность чисел a1,a2,a3 ... an.(цифры и n рядом из а это индексы).Найти...

Найти количество и сумму тех чисел последовательности, которые делятся на 5 и не делятся на 7
Здравствуйте. Мне нужно решить вот эту задачку: Дано натуральное число n, целые числа a1.....an....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru