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

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

02.08.2011, 21:11. Показов 5101. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru