Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/56: Рейтинг темы: голосов - 56, средняя оценка - 4.84
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256

Найти наибольший общий делитель двух чисел Фибоначчи

14.08.2015, 20:53. Показов 11260. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, решаю задачу, ошибка на шестом тесте. Условии задачи:

Кликните здесь для просмотра всего текста
Последовательностью Фибоначчи называется последовательность чисел F0 = 0, F1 = 1, … , Fk = Fk-1 + Fk-2 (k > 1).

Требуется найти наибольший общий делитель двух чисел Фибоначчи.

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

Во входном файле INPUT.TXT записаны два целых числа i и j (1 ≤ i, j ≤ 10 в 6-й степени).

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

В выходной файл OUTPUT.TXT выведите остаток от деления НОД чисел Fi и Fj на 10 в 9-й степени.


Шестой тест:

893854 102938

Мой код:

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>
#include <vector>
using namespace std;
 
 
int fib(_int64 n)
{
    if (n <= 2)
    {
        return 1;
    }
    vector<int>dp(n + 1);
    dp[1] = 1; dp[2] = 1;
    for (int i = 3; i <= n; i++)
    {
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    return dp[n];
}
int GCD(_int64 a, _int64 b)
{
    while (a != b)
    {
        if (a > b)
           a = a - b;
        else
            b = b - a;
    }
    return a;
}
 
int main()
{
    _int64 a, b;
    cin >> a >> b;
    if (a == 0 && b == 0)
        cout << 0 << endl;
    if (a == 0)
    {
        cout << fib(b) << endl;
        return 0;
    }
    if (b == 0)
    {
        cout << fib(a) << endl;
        return 0;
    }
    a = fib(a);
    b = fib(b);
    _int64 Result = (GCD(a, b));
    cout << Result % 1000000000 << endl;
    return 0;
}
Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.08.2015, 20:53
Ответы с готовыми решениями:

Найти наибольший общий делитель двух чисел Фибоначчи
Последовательностью Фибоначчи называется последовательность чисел F0 = 0, F1 = 1, … , Fk = Fk-1 + Fk-2 (k &gt; 1). Требуется найти...

Требуется найти наибольший общий делитель двух чисел Фибоначчи.
ЗАДАЧА №384 Числа Фибоначчи - 3 (Время: 1 сек. Память: 16 Мб Сложность: 52%) Последовательностью Фибоначчи называется...

Найти наибольший общий делитель двух чисел
Задание: найти наибольший общий делитель двух чисел. Сам код: #include &lt;iostream&gt; using namespace std; int main() { ...

33
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
14.08.2015, 21:09
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
typedef long long int _int64;
 
int GCD(_int64 a, _int64 b)
{
    while (a != b)
    {
        if (a > b)
           a = a - b;
        else
            b = b - a;
    }
    return a;
}
_int64 OCD(_int64 a, _int64 b)
{
    while (a != b)
    {
        if (a > b)
           a = a - b;
        else
            b = b - a;
    }
    return a;
}
int main() {
    std::cout << GCD(100000000000,100000000000) << std::endl;
    std::cout << OCD(100000000000,100000000000) << std::endl;
    return 0;
}
Code
1
2
1215752192
100000000000
С Фибоначчами еще хуже - засунуть в инт миллионное Фибоначчи надо сильно постараться.
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
14.08.2015, 21:12
1) Твой GCD медленно работает: нужно заменить вычитание на взятие остатка (если пользоваться пунктом 2 - то можно и не менять)
2) Насколько я помню, GCD(Fn, Fm) = FGCD(n, m)
3) Fn, где n = 10^6 - это много. Выйдем за пределы типа при вычислении Fn.

Решение: пользуясь пунктом 2, находим номер числа Фибоначчи. Причем, при вычислении этого числа нужно брать остаток от деления на 10^9. (т.е. f[n] = (f[n-1] + f[n-2]) % 1000000000
1
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
14.08.2015, 23:37  [ТС]
Цитата Сообщение от Dani Посмотреть сообщение
Решение: пользуясь пунктом 2, находим номер числа Фибоначчи. Причем, при вычислении этого числа нужно брать остаток от деления на 10^9. (т.е. f[n] = (f[n-1] + f[n-2]) % 1000000000
Не очень понял, что всё-таки здесь неправильно и как сделать правильно. Ведь мы и так знаем номер числа Фибоначчи - мы же задаём его сначала.

Добавлено через 9 минут
GCD(Fn, Fm) = FGCD(n, m) - Можете расшифровать формулу?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
14.08.2015, 23:43
Цитата Сообщение от Melvil Посмотреть сообщение
GCD(Fn, Fm) = FGCD(n, m) - Можете расшифровать формулу?
Ну это же просто, G,C и D сокращаются, остается (Fn, Fm) = F(n, m) - а это означает, что мы можем вынести поэлементное применение оператора F к паре за скобки этой пары, то есть применение оператора к паре означает применение его к каждому элементу этой пары.
0
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
14.08.2015, 23:48  [ТС]
Цитата Сообщение от _Ivana Посмотреть сообщение
Ну это же просто, G,C и D сокращаются, остается (Fn, Fm) = F(n, m) - а это означает, что мы можем вынести поэлементное применение оператора F к паре за скобки этой пары, то есть применение оператора к паре означает применение его к каждому элементу этой пары.
Я глубоко извиняюсь, но всё же, получается (Fn, Fm) = (Fn,Fm) - да, равенство доказано, но что вообще нам даёт эта формула?
0
14.08.2015, 23:49

Не по теме:

Melvil, я просто глупо и неуместно пошутил :) Но оратор выше дал вам достаточно информации.

0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
14.08.2015, 23:56
Цитата Сообщение от Melvil Посмотреть сообщение
что вообще нам даёт эта формула?
Наибольший общий делитель от двух чисел Фибоначчи - это число Фибоначчи с номером, равным наибольшему общему делителю от номеров тех двух чисел Фибоначчи.
0
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
15.08.2015, 00:39  [ТС]
Окей, использую формулу, сейчас то где ошибка?:

Шестой тест: 893854 102938

Мой код:

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 <vector>
using namespace std;
 
 
int fib(_int64 n)
{
    if (n <= 2)
    {
        return 1;
    }
    vector<int>dp(n + 1);
    dp[1] = 1; dp[2] = 1;
    for (int i = 3; i <= n; i++)
    {
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    return dp[n];
}
int GCD(_int64 a, _int64 b)
{
    while (a != b)
    {
        if (a > b)
           a = a - b;
        else
            b = b - a;
    }
    return a;
}
 
int main()
{
    _int64 n, m, Result;
    cin >> n >> m;
    Result = fib(GCD(n, m));
    cout << Result % 1000000000 << endl;
}
Добавлено через 4 минуты
Даже при вводе 7 и 7 - аварийное завершение работы.

Добавлено через 2 минуты
Странно, если использую алгоритм Евклида с делением, то происходит деление на ноль, если нет - то всё в порядке.

Добавлено через 17 минут
При использовании больших чисел:
893854 102938
Выдаёт единицу, хотя должна быть двойка, как минимум.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
15.08.2015, 00:43
Melvil,
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
#include <iostream>
 
unsigned long long fibonacci(unsigned n)
{
    unsigned count = 0;
    unsigned long long fib = 0, fib1 = 0, fib2 = 1;
    while (true)
    {
        ++count;
        if (count == n) break;
        fib = fib1 + fib2;
        fib1 = fib2;
        fib2 = fib;
    }
    
    return fib1;
}
 
unsigned GCD (unsigned a, unsigned b)
{
    while (a - b)
        if (a > b) a -= b;
        else b -= a;
        
    return a;
}
 
int main()
{
    unsigned ni, nj, nx;
    unsigned long long fnx;
 
    std::cin >> ni >> nj;
    nx = GCD(ni, nj);
 
    fnx = fibonacci(nx) % 1000000000;
    std::cout << fnx  << std::endl;
    
    return 0;
}
Но у меня закрадывается мутное сомнение по поводу той самой формулы

Добавлено через 53 секунды
Цитата Сообщение от Melvil Посмотреть сообщение
Выдаёт единицу, хотя должна быть двойка, как минимум.
Единица - это второе(та самая двойка) число Фибоначчи.
0
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
15.08.2015, 00:49  [ТС]
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Единица - это второе(та самая двойка) число Фибоначчи.
Да, я уже понял, но врёт же формула

Добавлено через 3 минуты
Kerry_Jr, У вас первый тест не проходит: 10 и 5 - ответ должен быть пять. Я склоняюсь к тому, что числа Фибоначчи стоит начинать считать с единицы, а не с нуля.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
15.08.2015, 00:50
Цитата Сообщение от Melvil Посмотреть сообщение
но врёт же формула
Бывают номера, у которых НОД 1, а первое число - это ноль, но ведь ноль не может быть НОДом? Я ведь не один так думаю?
0
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
15.08.2015, 00:51  [ТС]
Исправленная версия также точно стопорится на шестом тесте, т.к. формула то выдаёт один, вместо двух.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
15.08.2015, 00:51
Цитата Сообщение от Melvil Посмотреть сообщение
Последовательностью Фибоначчи называется последовательность чисел F0 = 0, F1 = 1, … , Fk = Fk-1 + Fk-2 (k > 1).
Ну не знаю, по зданию с нуля.
0
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
15.08.2015, 00:52  [ТС]
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
первое число - это ноль, но ведь ноль не может быть НОДом?
Насколько я знаю, ноль делится на любое число, т.е., если a=0, то НОД = b.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
15.08.2015, 00:52
Цитата Сообщение от Melvil Посмотреть сообщение
ответ должен быть пять
Вам нужно чтобы выдавало номер числа или само число, я что-то не разберусь никак.
0
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
15.08.2015, 00:54  [ТС]
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Ну не знаю, по зданию с нуля.
Да, некорректно написано, конкретно в данной задаче стоит считать с единицы.

Добавлено через 1 минуту
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Вам нужно чтобы выдавало номер числа или само число, я что-то не разберусь никак.
остаток от деления НОД чисел Fi и Fj на 10^9
Т.е. Fnod(m,n) % 1000000000
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
15.08.2015, 00:59
Цитата Сообщение от Melvil Посмотреть сообщение
стоит считать с единицы.
тогда в моем варианте в функции fibonacci замените fib1=0 на fib1=1
1
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
15.08.2015, 01:33  [ТС]
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
тогда в моем варианте в функции fibonacci замените fib1=0 на fib1=1
Я уже писал выше, что такая же ошибка - Wrong Answer на шестом тесте: 893854 102938.

Добавлено через 1 минуту
Судя по всему, не хватает размера int'a

Добавлено через 13 минут
Собственно говоря, с использованием данной формулы всё вроде бы встаёт на свои места без всяких long int'ov, только вот неверный ответ почему-то.

Добавлено через 16 минут
Могу точно сказать, что программа работает верно, видимо с тестом что-то не то. Всем спасибо!

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>
 
int fibonacci(int n)
{
    int count = 0;
    int fib = 0, fib1 = 1, fib2 = 1;
    while (true)
    {
        ++count;
        if (count == n) break;
        fib = fib1 + fib2;
        fib1 = fib2;
        fib2 = fib;
    }
 
    return fib1;
}
 
unsigned GCD(int a, int b)
{
    while (a - b)
        if (a > b) a -= b;
        else b -= a;
 
        return a;
}
 
int main()
{
    int ni, nj, nx;
    int fnx;
 
    std::cin >> ni >> nj;
    nx = GCD(ni, nj);
    fnx = fibonacci(nx) % 1000000000;
    std::cout << fnx << std::endl;
    return 0;
}
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
15.08.2015, 09:11
Что за глупость - в алгоритме Евклида отнимать от большего меньшее (вместо взятия остатка). Если большее 2^63 (или 2^100 при использовании длинной арифметики), а меньшее 1, то сколько надо времени?

Это же надо так испоганить эффективный алгоритм нахождения НОДа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.08.2015, 09:11
Помогаю со студенческими работами здесь

Найти наибольший общий делитель двух чисел
найти наибольший общий делитель двух чисел с помощью рекурсии и без нее

Найти наибольший общий делитель двух чисел
Задача &quot;Длинный НОД&quot; Даны два числа. Найти их наибольший общий делитель. Входные данные Вводятся два натуральных числа, не превышающих 10^9...

Найти наибольший общий делитель двух чисел
Для заданных натуральных целых чисел n и m найти наибольший общий делитель (НОД), используя следующее соотношение НОД(n, m) = НОД (n, r),...

Найти наибольший общий делитель двух натуральных чисел
номер 2: Составьте программу определения наибольшего общего делителя двух натуральных чисел.

Найти наибольший общий делитель двух введённых чисел
Здравствуйте. Такая проблема. Нужно выявить наибольший общий делитель двух введённых чисел. Хотел проверить все числа, на которые...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru