Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 412

/ вопрос открыт /

Здравствуйте, не могли бы вы мне помочь
есть такая задача:
вывести последние восемь цифр n-ого числа фиббоначи, отбрасывая незначащие нули
n вводится с клавы
есть одна проблема
n - до 10^18 степени!
и чтобы расчеты укладывались в сек
пример: n=10
ответ: 89

то есть если просто складывать - то в секунду не уложится!(

подсказывали такой алгоритм:

возвести матрицу

|1 1|
|1 0|

в степень n - и получим матрицу

|что-то Fn |
|Fn что-то|

вот вывести последние 8 цифр числа Fn
можете подсказать, как реализовать так, чтобы в секунду уместились расчеты?
что то не могу догадаться, как так прописать(
алгоритм взял с википедии
здесь самое главное, чтобы расчеты укладывались в секунду!
n от 1 до 10^18
вывести последние 8 чисел n-ого числа фиббоначи!
заранее спасибо!

Ruslan Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ruslan (статус: 1-ый класс)
Вопрос отправлен: 17 ноября 2009, 00:04
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 21 ноября 2009, 00:17; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 17 ноября 2009, 00:33 [#1]:

на той же википедии читаем

Цитата:

Последние цифры чисел Фибоначчи образуют периодическую последовательность с периодом 60, последняя пара цифр чисел Фибоначчи образует последовательность с периодом 300, последние три цифры — с периодом 1500, последние четыре — с периодом 15000, последние пять — с периодом 150000 и т. д.

то есть, если бы надо было узнать только последнюю цифру, то просто заданное число делим на 60 (это быстренько). а для чисел от 0 до 59 задача работает быстро. даже для последних пять задача очень легко решается указанным методом.
Смотря на порядок цифр, подозреваю, что для последних 8 цифр это буде порядка 150000000, что вполне решаемо.
Галочка "подтверждения прочтения" - вселенское зло.
Ruslan

Ruslan (статус: 1-ый класс), 21 ноября 2009, 00:17 [#2]:

program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
const p=100000000;
var f0,f1,f2,i,c:longint;
    n,lol,k:int64;
    input,output:text;
    s:string;
begin
   assign(input,'input.txt');
   reset(input);
   assign(output,'output.txt');
   rewrite(output);
 
   f0:=0;
   f1:=1;
   c:=0;
   read(input,s);
   lol:=1;n:=0;
   for i:=length(s) downto 1 do
     begin
       n:=n+(ord(s[i])-ord('0'))*lol;
       lol:=lol*10;
     end;
 
   k:=n mod 150000000;
   // это улучшенный алгоритм нахождения k-ого числа фибоначчи
 
   repeat
     f2:= (f0+f1) mod p;
     f0:=f1;
     f1:=f2;
     c:=c+1;
   until (c>=k) or (f0=0) and (f1=1);
   if c<k then
    begin
     k:=k mod c;
     for i:=1 to k do
      begin
        f2:=(f0+f1) mod p;
        f0:=f1;
        f1:=f2;
      end;
    end;
    write(output,f1);
    close(input);
    close(output);

по времени не проходит
как еще увеличить скорость нахождения 150000000 числа фибоначчи - и вообще правильный ли алгоритм, можете сказать?

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:41
Выполнено за 0.02 сек.