#include #include using namespace std; #define ll long long #define ull unsigned long long #define rep(i, n) for (decltype(n) i = 0; i < (n); i++) #define rep1(i, n) for (decltype(n) i = 1; i <= (n); i++) #define repr(i, n) for (decltype(n) i = (n)-1; i >= 0; i--) #define repr1(i, n) for (decltype(n) i = (n); i > 0; i--) auto chmax = [](auto& a, auto b) {bool ret=ab; if(ret)a=b; return ret; }; template using pq_inv = priority_queue, greater>; vector dd4={1, 0, -1, 0, 1}; // 4方位 rep(i,4) nh=h+dd4[i]; nw=w+dd4[i+1]; vector dd8={1, 0, -1, 0, 1, 1,-1, -1, 1}; // 8方位 rep(i,8) nh=h+dd8[i]; nw=w+dd8[i+1]; template struct Matrix{ vector> mat; vector> tmp; int row=0,col=0; Matrix(vector>& M) { mat=M; row=M.size(); col=M[0].size(); tmp.resize(row,vector(col)); } Matrix(int r, int c, int x=0) { mat=vector(r,vector(c,x)); row=r; col=c; tmp.resize(row,vector(col)); } vector& operator[](int i) {return mat[i];} Matrix operator*(int x){ tmp.assign(row, vector(col)); for(int i=0; i operator+(Matrix& M){ tmp.assign(row, vector(col)); for(int i=0; irow); tmp.assign(row, vector(col)); for(int i=0; icol; j++){ for(int k=0; krow); tmp.assign(row, vector(col)); for(int i=0; icol; j++){ for(int k=0; k0){ if(p&1) ret = ret.dot(x); x = x.dot(x); p>>=1; } return ret; } Matrix pow(int p, int mod){ assert (row==col); Matrix x=mat; Matrix ret(row, col); for(int i=0; i0){ if(p&1) ret = ret.dot(x, mod); x = x.dot(x, mod); p>>=1; } return ret; } void print(){ for(int i=0; i> N>>M; vector> A={{0,1},{1,1}} ; Matrix mat(A); mat = mat.pow(N-2,M); cout << (mat[0][0] + mat[0][1])%M << endl; } int main() { std::cin.tie(nullptr); int T; // cin >> T; T=1; for(int i=0; i