#include //#include using namespace std; //using namespace atcoder; using ll = long long; ll mod; // 行列積 vector> mat_mul(vector> &a, vector> &b) { vector> ret((int)a.size(), vector((int)b[0].size())); for (int i = 0; i < (int)a.size(); i++) { for (int j = 0; j < (int)b[0].size(); j++) { for (int k = 0; k < (int)b.size(); k++) { ret[i][j] += a[i][k] * b[k][j]; ret[i][j] %= mod; } } } return ret; } // 行列累乗 vector> mat_pow(vector> a, long long n) { vector> ret((int)a.size(), vector((int)a.size())); // 単位行列で初期化 for (int i = 0; i < (int)a.size(); i++) { ret[i][i] = 1; } // 繰り返し二乗法 while (n > 0) { if (n & 1) { ret = mat_mul(a, ret); } a = mat_mul(a, a); n >>= 1; } return ret; } int main() { ios::sync_with_stdio(false); cin.tie(0); int N, M; cin >> N >> M; mod = M; vector> f(2, vector(2)); f[0][0] = f[0][1] = f[1][0] = 1; f[1][1] = 0; f = mat_pow(f, N - 1); ll ans = f[1][0]; cout << ans << endl; return 0; }