#include /** * Matlix Library */ using Vec = std::vector; using Mat = std::vector; Mat eye(long long n) { Mat result(n, Vec(n)); for (size_t i = 0; i < n; i++) { result[i][i] = 1; } return result; } Mat mul(const Mat& A, const Mat& B, long long _mod=-1) { Mat result(A.size(), Vec(B.front().size())); for (size_t i = 0; i < A.size(); i++) { for (size_t k = 0; k < B.size(); k++) { for (size_t j = 0; j < B.front().size(); j++) { if (_mod == -1) result[i][j] += A[i][k] * B[k][j]; else result[i][j] = (result[i][j] + A[i][k] * B[k][j]) % _mod; } } } return result; } Mat pow(Mat A, long long n, long long _mod=-1) { Mat result = eye(static_cast(A.size())); while (n > 0) { if (n & 1) { if (_mod == -1) result = mul(result, A); else result = mul(result, A, _mod); } if (_mod == -1) A = mul(A, A); else A = mul(A, A, _mod); n >>= 1; } return result; } /** * End */ int main() { long long N, M; std::cin >> N >> M; Mat A(2, Vec(2)); A[0][0] = A[0][1] = A[1][0] = 1; A[1][1] = 0; A = pow(A, N - 1, M); std::cout << A.back().front() << std::endl; }