Tìm số dư khi chia số Fibonaci cho 1000000

Mô tả Bài toán:

Số Fibonacci bắt đầu từ số 0 và 1. Số Fibonacci khởi đầu sẽ là 0, và số Fibonacci đầu tiên sẽ là 1. Kể từ đó, số thứ hai sẽ là tổng của hai số Fibonacci trước đó.

Công thức của Fn = Fn-1 + Fn-2 (n> = 2).

Các số Fibonacci đến n = 16 như sau: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987.

Viết chương trình tìm ra số Fibonacci thứ n. Tuy nhiên, bởi vì con số đó có thể rất lớn, cho nên chúng ta sẽ in ra kết quả sau khi chia lấy dư với 1,000,000.

Các bạn có thể tham khảo 1001 số Fibonacci đầu tiên trong lúc debug chương trình của các bạn tại http://www.fullbooks.com/The-first-1001-Fibonacci-Numbers.html.

Mô tả Input:

  • Dòng đầu tiên sẽ là số nguyên dương n với giá trị nhỏ hơn hoặc bằng 1,000,000,000,000,000,000.

Mô tả Output:

  • Kết quả của số Fibonacci thứ n sau khi chia lấy dư với 1,000,000.
Minh họa Input Output
1 0 0
2 1 1
3 2 1
4 597 881602


trong hình là đoạn code em làm. nhưng em nộp bài thì nó bị lỗi time limit exceed . mọi người có thể giúp em được không ạ

  1. N này chỉ có long long mới chịu nổi.
  2. Dùng ma trận max speed :smiley:
3 Likes

là dùng cách nhân ma trận phải không ạ

Lũy thừa một ma trận.

Dễ thấy:
[1 1 | 1 0] x [Fk | Fk-1] = [Fk+1 | Fk]
nên đặt M1 = [1 1 | 1 0]
vậy theo nguyên lí quy nạp và định nghĩa phép nhân, Mn := [Fn+1 Fn | Fn Fn-1] = M1n

Theo đó ta gọi m1 := vector cột bên phải của M1, có luôn Mk x mk’ = mk+k’.

Ta tính theo kiểu bình phương - nhân, nói chung cứ đặt a, b, c, d mà tính chứ ko cần lập mảng gì :smiley: nó có liên quan đến biểu diễn nhị phân của số mũ.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?