// 需要保证matrix[i].size()==other.size(),为了运行效率此处不做断言 Matrix operator*(const Matrix& other) const { int n = matrix.size(), m = matrix[0].size(), p = other[0].size(); Matrix ans(n, p); for (int i = 0; i < n; i++) { for (int j = 0; j < p; j++) { for (int k = 0; k < m; k++) { ans[i][j] = (ans[i][j] + matrix[i][k] * other[k][j]) % MOD; } } } return ans; }
Matrix pow(int n)const{ Matrix a = Matrix(matrix); Matrix ans = Matrix(matrix.size()); while (n) { if (n & 1) { ans = ans * a; } a = a * a; n >>= 1; } return ans; }
size_tsize()const{ return matrix.size(); } };
classSolution { private: Matrix buildMAT(int n){ Matrix res = Matrix(n, n); for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { res[i][j] = 1; } } return res; }
Matrix buildMAT2(int n){ Matrix res = Matrix(n, n); for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { res[i][j] = 1; } } return res; }
Matrix buildUpDown(int n){ Matrix res = Matrix(1, n); for (int i = 0; i < n; i++) { res[0][i] = 1; } return res; } public: intzigZagArrays(int n, int l, int r){ n--; Matrix MAT = buildMAT(r - l + 1); Matrix MAT2 = buildMAT2(r - l + 1); Matrix MATA = MAT * MAT2; Matrix toMul = MATA.pow(n / 2); if (n % 2) { toMul = toMul * MAT; } Matrix up = buildUpDown(r - l + 1); Matrix matrixAns = up * toMul; ll ans = 0; for (int i = 0; i < matrixAns[0].size(); i++) { ans += matrixAns[0][i]; } return ans * 2 % MOD; } };
#ifdef _DEBUG /* 3 4 5
2 */ intmain(){ int a, b, c; while (cin >> a >> b >> c) { Solution sol; cout << sol.zigZagArrays(a, b, c) << endl; } return0; } #endif