Hi mọi người.
Em có đang làm 1 bài tập là tính (Fn mod m) với Fn là số fibonacci thứ n (n <= 10^18) và 2 <= m <= 10^3.
Em dùng chu kỳ Pisano: https://vi.wikipedia.org/wiki/Chu_k%E1%BB%B3_Pisano
Ví dụ Fi mod 2 sẽ có dãy chu kỳ là 0 1 1 0 1 1 0 1 1 …
Fi mod 3 sẽ có dãy chu kỳ là 0 1 1 2 0 2 2 1 0 1 1 2 0 2 2 1 …
với dãy lặp 01120221 có độ dài là 8. Khi nó, nếu muốn tính F2015 mod 3 thì mình có 2015 = 251.8 + 7 nên F2015 mod 3 = F7 mod 3 = 1.
Ý tưởng thuật toán của em là sẽ tính mod dần dần Fi cho m với từng lần lặp for. Và khi gặp chuỗi 0 1
(là chuỗi bắt đầu 1 chu trình mới lặp lại) sẽ dừng lại, tìm được chiều dài chu trình.
CODE:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
long long n;
int m, length;
cin >> n >> m;
vector<int> arr;
arr.push_back(0);
arr.push_back(1);
for (int i = 2; i <= n; ++i) {
arr.push_back((arr[i - 1] + arr[i - 2]) % m);
if ((arr[i] == 1) && (arr[i - 1] == 0)) {
length = i - 1;
break;
}
}
cout << arr[n % length];
return 0;
}
Submit lên Coursera thì bị lỗi ở testcase 100 100
Up lên IDEone thì testcase 100 100
cho ra kết quả 1, trong khi codeblocks em cho ra kết quả 75
!
Mọi người có ai biết lỗi này do đâu ko ạ?
Nếu thuật toán em chạy sai cho em xin cách chữa ạ!
Xin cảm ơn !