#include #define rep(i, n) for(ll i = 0; i < n; ++i) #define rep2(i, a, b) for(ll i = a; i <= b; ++i) #define rep3(i, a, b) for(ll i = a; i >= b; --i) #define all(c) begin(c), end(c) #define SUM(v) accumulate(all(v), 0LL) #define MIN(v) *min_element(all(v)) #define MAX(v) *max_element(all(v)) using namespace std; //using namespace atcoder; using ll = long long; typedef pair P; typedef pair PP; typedef vector > Graph; template inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } const ll INF = 2e18+5; #define debug(v) cout<<#v<<": ",prt(v); template inline void prt(pair p){cout<<"("< inline void prt(tuple p){cout<<"("<(p)<<", "<(p)<<", "<(p)<<")\n";} inline void prt(bool p){if(p)cout<<"True"<<'\n';else cout<<"False"<<'\n';} template inline void prt(vector v){cout<<'{';for(ll i=0;i inline void prt(vector >& vv){ for(const auto& v : vv){ prt(v); } } template inline void prt(deque v){cout<<'{';for(ll i=0;i inline void prt(map v){cout<<'{';ll c=0;for(auto &p: v){cout< inline void prt(unordered_map v){cout<<'{';ll c=0;for(auto &p: v){cout< inline void prt(set v){cout<<'{';for(auto i=v.begin();i!=v.end();i++){cout<<*i;if(i!=--v.end())cout<<", ";}cout<<'}'<<'\n';} template inline void prt(multiset v){cout<<'{';for(auto i=v.begin();i!=v.end();i++){cout<<*i;if(i!=--v.end())cout<<", ";}cout<<'}'<<'\n';} ll n,m; using Matrix = vector >; Matrix multiply(Matrix &A, Matrix &B){ //A x B を求める int sz = A.size(); Matrix C(sz); rep(i,sz)C[i].resize(sz,0); rep(i,sz){ rep(j,sz){ rep(k,sz){ C[i][j] += A[i][k]*B[k][j]; C[i][j]%=m; } } } return C; } Matrix powers(Matrix A, ll k){ //Aのk乗を求める vector E(64); ll sz = A.size(); Matrix F(sz); rep(i,sz)F[i].resize(sz,0); rep(i,sz)F[i][i]=1; E[0]=A; rep(i,62){ E[i+1] = multiply(E[i],E[i]); } rep(i,63){ if((k>>i)&1LL){ F = multiply(F,E[i]); } } return F; } int main(){ ios::sync_with_stdio(false); std::cin.tie(nullptr); cin >> n >> m; Matrix A(2); rep(i,2)A[i].resize(2,1); A[1][1]=0; Matrix Z = powers(A,n-2); cout << Z[0][0] << endl; return 0; }