Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/23: Рейтинг темы: голосов - 23, средняя оценка - 4.52
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297

Бесконечная последовательность

02.08.2011, 21:11. Показов 5030. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача

Моё решение на плюсах
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
#include <iostream>
#include <map>
 
using namespace std;
 
long long p, q, x, y;
map <long long, long long> pc;
 
long long f(long long n)
{
    if (n < 1)
        return 1;
    else
    {
        long long a = n / p - x, b = n / q - y;
 
        if (!pc[a])
            pc[a] = f(a);
 
        if (!pc[b])
            pc[b] = f(b);
 
        pc[n] = pc[a] + pc[b];
 
        return pc[n];
    }
}
 
int main()
{
    long long n;
 
    cin >> n >> p >> q >> x >> y;
 
    cout << f(n) << endl;
 
    return 0;
}


Есть подозрения, что при каком-то наборе данных алгоритм зацикливается (но не должно же - чем глубже рекурсия, тем меньший элемент последовательности ищется, вроде всегда так), пробовал крайние значения - работает в доли секунды.

Помогите, люди добрые!

Или хоть контрпример подскажите...
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.08.2011, 21:11
Ответы с готовыми решениями:

Бесконечная последовательность
Добрый день! начала изучать новую тему, прочитала кучу разного материала, но на практике ничего не получается, так как нет достойного...

Бесконечная последовательность десятичных цифр
Бесконечная последовательность десятичных цифр содержит запись последовательных целых чисел: 123456789101112... Определить какая цифра...

Бесконечная последовательность рациональных чисел v0, v1 , . образована по следующему закону :
Описание задачи необходимо вставлять в текстовом виде Бесконечная последовательность рациональных чисел v0, v1 , ... образована по...

50
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
03.08.2011, 14:01
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от BAIZOR Посмотреть сообщение
То на ТопКодере она может пройти, а на Кодфорсесе нет?
Вполне. Поэтому тайм-лимиты на этих серверах могут быть разными.
1
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
03.08.2011, 14:02
Цитата Сообщение от grizlik78 Посмотреть сообщение
Вполне. Поэтому тайм-лимиты на этих серверах могут быть разными.
ну ладно, я не люблю спорить. И на 100% я не знаю, но я очень сомневаюсь в Вашей правоте.
0
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
03.08.2011, 14:03  [ТС]
Цитата Сообщение от Хохол Посмотреть сообщение
Думаю вы уже поняли что оценка неверна.
Она верна только для x = y = 0
Цитата Сообщение от BAIZOR Посмотреть сообщение
Или если на одном сервере стоит процессор более мощьный чем на другом, то на мощьном сервере решение пройдет, а на слабом нет?
Могу выложить исходник, который проходит тут и не проходит тут. При одинаковых тестах и условии.
Цитата Сообщение от grizlik78 Посмотреть сообщение
Если внимательно посмотреть, то на всех таких серверах тестовые задания выстраиваются в очередь.
Пруф
Цитата Сообщение от Хохол Посмотреть сообщение
И хватит гнать на хешмапу, она классная, прочитайте сначала литературу.
Но она только в C++0x. А жаль. Прийдется сохранять значения только для значений, меньших какого-то предела, сколько памяти хватит
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
03.08.2011, 14:10
Цитата Сообщение от iama Посмотреть сообщение
Могу выложить исходник, который проходит тут и не проходит тут. При одинаковых тестах и условии.
почти убедили
А вдруг это какието старые версии контестных серверов?)
Мне уже аж интересно стало, пойду в гугл копать...
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
03.08.2011, 14:18
Если проблема в количестве вызовов порядка 5 млн, хешмапа может помочь.
Напишите уже её руками.
Кстати если у них vs 2008, хешмапа находится в namespace stdext.
1
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
03.08.2011, 14:23  [ТС]


Я сдал!
На пределе, между прочим.
Мое решение (страшный быдлокод)
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
54
55
56
#include <stdio.h>
 
#define MAX_N 14000000
 
long long p, q, x, y;
int ar[MAX_N];
 
long long f(long long n)
{
    if (n < 1)
        return 1;
    else
    {
      if (n < MAX_N && ar[n])
      return ar[n];
 
    long long a = n / p - x, b = n / q - y, ax, bx;
 
    if (a < 1)
      ax = 1;
    else if (a < MAX_N && ar[a])
      ax = ar[a];
    else
    {
      ax = f(a);
      if (a < MAX_N)
        ar[a] = ax;
    }
 
    if (b < 1)
      bx = 1;
    else if (b < MAX_N && ar[b])
      bx = ar[b];
    else
    {
      bx = f(b);
      if (b < MAX_N)
        ar[b] = bx;
    }
 
    return ax + bx;
    }
}
 
int main()
{
    long long n;
 
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
 
    scanf("%I64d %I64d %I64d %I64d %I64d", &n, &p, &q, &x, &y);
    printf("%I64d\n", f(n));
 
    return 0;
}

Еле-еле вписался. Сделал статический массив, хранил значения только для таких i, что меньше определенного значения, в мапе на примере от grizlik78 хранились соответствия для всех чисел от 1 до 1000, вот и решил сделать тупо через статический массив.

Смущает другое - на этом же сайте люди с 5 мб памяти сдают... Но это ладно...

Огромное всем человеческое спасибо!

Добавлено через 2 минуты
Цитата Сообщение от BAIZOR Посмотреть сообщение
А вдруг это какието старые версии контестных серверов?)
Не, там просто сервер трухлявый, маломощный
Цитата Сообщение от Хохол Посмотреть сообщение
Кстати если у них vs 2008, хешмапа находится в namespace stdext.
Дак не компилило у них на серве с ней, представляете? Я ж сам в шоке, вроде должна быть. Вы же hash_map имеете в виду?
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
03.08.2011, 14:54
У меня была похожая идея, только я решил честно вычислять первые значения.
Меняя параметр THRESHOLD можно обменивать время начальной инициализации и размер вектора на количество вставок в мапу и, соответственно, время вычисления самой функции.
Собственно
код
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
54
55
56
57
58
59
60
61
#include <iostream>
#include <map>
#include <vector>
#include <cstdlib>
 
using namespace std;
 
long long p, q, x, y;
map <long long, long long> pc;
vector<int> first_nums;
int const THRESHOLD = 5000000;
 
void finit()
{
    first_nums.resize(THRESHOLD);
    first_nums[0] = 1;
    for (int num = 1; num < THRESHOLD; ++num)
    {
        int a = max<long long>(0, num / p - x), b = max<long long>(0, num / q - y);
        first_nums[num] = first_nums[a] + first_nums[b];
    }
}
 
long long f(long long n)
{
    if (n < 0)
        return 1;
    long long res = 1;
    if (n < THRESHOLD)
        res = first_nums[n];
    else if (!(res = pc[n]))
    {
        long long a = max<long long>(0, n / p - x), b = max<long long>(0, n / q - y), fa = 1, fb = 1;
 
        if (a < THRESHOLD)
            fa = first_nums[a];
        else if (!(fa = pc[a]))
            fa = pc[a] = f(a);
 
        if (b < THRESHOLD)
            fb = first_nums[b];
        else if (!(fb = pc[b]))
            fb = pc[b] = f(b);
 
        res = pc[n] = fa + fb;
    }
    return res;
}
 
int main()
{
        long long n;
 
        cin >> n >> p >> q >> x >> y;
        
        finit();
 
        cout << f(n) << endl;
 
        return 0;
}
.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
07.08.2011, 15:12
А если так:
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
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
typedef long long  T_num;
/////////////////////////////////////////////////////////////////////////////////////////
T_num  res  = 0;
 
T_num  p    = 0;
T_num  q    = 0;
T_num  x    = 0;
T_num  y    = 0;
/////////////////////////////////////////////////////////////////////////////////////////
void  A(T_num  i)
{    
    if(i <= 0)
    {
        ++res;
    }
    else
    {
        A(i / p - x);
        A(i / q - y);        
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::cout << "n = "; 
    T_num  n = 0;
    std::cin >> n;
 
    std::cout << "p = ";
    std::cin >> p;
 
    std::cout << "q = ";
    std::cin >> q;
 
    std::cout << "x = ";
    std::cin >> x;
 
    std::cout << "y = ";
    std::cin >> y;
    
    A(n);
 
    std::cout << "res = "
              << res
              << std::endl;
}
1
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
07.08.2011, 17:39  [ТС]
Mr.X, мы уже пробовали простой рекурсией, при больших N и малых P и Q не проходит
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
07.08.2011, 19:40
Цитата Сообщение от iama Посмотреть сообщение
Mr.X, мы уже пробовали простой рекурсией, при больших N и малых P и Q не проходит
Ну дак здесь же не надо ждать возвращаемых значений, поэтому должно работать быстрее.
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
07.08.2011, 20:05
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну дак здесь же не надо ждать возвращаемых значений, поэтому должно работать быстрее.
Да, но вызовов функции при этом будет недопустимо много, из-за того, что будут вычисляться давно уже посчитанные значения, которые, в свою очередь, для вычисления сами требуют многократного вызова функции.
Даже для значений
1000000000 2 2 0 0
результата ждать придётся очень долго, хотя реально надо вычислить всего 3 десятка значений.

Добавлено через 10 минут
Сравните:
Ваш вариант
$ echo 1000000000 2 2 0 0 | /usr/bin/time ./a.out
n = p = q = x = y = res = 1073741824
160.84user 0.02system 2:40.98elapsed 99%CPU (0avgtext+0avgdata 3696maxresident)k
0inputs+0outputs (0major+289minor)pagefaults 0swaps
Вариант из первого поста
$ echo 1000000000 2 2 0 0 | /usr/bin/time ./a.out
1073741824
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3920maxresident)k
0inputs+0outputs (0major+303minor)pagefaults 0swaps
Почти 3 минуты против 0 секунд
Это на нетбуке. На десктопе побыстрее будет, конечно, но всё же.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.08.2011, 20:05
Помогаю со студенческими работами здесь

Бесконечная сфера и бесконечная плоскость
Даже не знаю в какой степени это геометрический вопрос, но пересекает ли бесконечная плоскость бесконечную сферу?

Бесконечная рекурсия
есть 2 функции который должны возвращать 0 или 1 в зависимости от элементов массивов PA и element. Известно что значения этих функций при...

Бесконечная загрузка ОС
Всем доброго времени суток! Иногда сталкиваюсь с проблемой бесконечной загрузки ОС. Проблема появляется не систематически, может пару...

Бесконечная загрузка
бесконечно грузит, потом перезагружает компьютер и опять так же.До этого пытался поставит 10 винду выдало ошибку и теперь даже если ставишь...

Бесконечная игра
Я где-то читал что раньше была игра переносная (как тамогочи только не томагочи а летать на корабле там надо было) и программа у этой игры...


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

Или воспользуйтесь поиском по форуму:
51
Ответ Создать тему
Новые блоги и статьи
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