#include <iostream>
#include <iomanip>
using namespace std;
struct Matrix
{
int m[2][2] = {{1,1},{1,0}};
};
Matrix operator*(const Matrix& a, const Matrix& b)
{
Matrix m;
m.m[0][0] = a.m[0][0]*b.m[0][0]+a.m[0][1]*b.m[1][0];
m.m[0][1] = a.m[0][0]*b.m[0][1]+a.m[0][1]*b.m[1][1];
m.m[1][0] = a.m[1][0]*b.m[0][0]+a.m[1][1]*b.m[1][0];
m.m[1][1] = a.m[1][0]*b.m[0][1]+a.m[1][1]*b.m[1][1];
return m;
}
Matrix pow(Matrix M, int N)
{
if (N == 1) return Matrix{};
Matrix m = pow(M,N/2);
m = m*m;
if (N%2) m = M*m;
return m;
}
int fib(int N)
{
Matrix M = pow(Matrix{},N);
return M.m[0][1];
}
int main()
{
for(int i = 1; i < 20; ++i)
{
cout << i << " " << fib(i) << endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTWF0cml4CnsKICAgIGludCBtWzJdWzJdID0ge3sxLDF9LHsxLDB9fTsKfTsKCk1hdHJpeCBvcGVyYXRvciooY29uc3QgTWF0cml4JiBhLCBjb25zdCBNYXRyaXgmIGIpCnsKICAgIE1hdHJpeCBtOwogICAgbS5tWzBdWzBdID0gYS5tWzBdWzBdKmIubVswXVswXSthLm1bMF1bMV0qYi5tWzFdWzBdOwogICAgbS5tWzBdWzFdID0gYS5tWzBdWzBdKmIubVswXVsxXSthLm1bMF1bMV0qYi5tWzFdWzFdOwogICAgbS5tWzFdWzBdID0gYS5tWzFdWzBdKmIubVswXVswXSthLm1bMV1bMV0qYi5tWzFdWzBdOwogICAgbS5tWzFdWzFdID0gYS5tWzFdWzBdKmIubVswXVsxXSthLm1bMV1bMV0qYi5tWzFdWzFdOwogICAgcmV0dXJuIG07Cn0KCk1hdHJpeCBwb3coTWF0cml4IE0sIGludCBOKQp7CiAgICBpZiAoTiA9PSAxKSByZXR1cm4gTWF0cml4e307CiAgICBNYXRyaXggbSA9IHBvdyhNLE4vMik7CiAgICBtID0gbSptOwogICAgaWYgKE4lMikgbSA9IE0qbTsKICAgIHJldHVybiBtOwp9CgppbnQgZmliKGludCBOKQp7CiAgICBNYXRyaXggTSA9IHBvdyhNYXRyaXh7fSxOKTsKICAgIHJldHVybiBNLm1bMF1bMV07Cn0KCmludCBtYWluKCkKewogICAgZm9yKGludCBpID0gMTsgaSA8IDIwOyArK2kpCiAgICB7CiAgICAgICAgY291dCA8PCBpIDw8ICIgICAiIDw8IGZpYihpKSA8PCBlbmRsOwogICAgfQp9Cg==