結果
問題 | No.891 隣接3項間の漸化式 |
ユーザー |
|
提出日時 | 2019-09-20 22:14:00 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 7,462 bytes |
コンパイル時間 | 2,081 ms |
コンパイル使用メモリ | 179,816 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-09-14 17:58:48 |
合計ジャッジ時間 | 3,197 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 39 |
ソースコード
#include <bits/stdc++.h>using namespace std;template<class Numeric> class Matrix {protected:vector< vector<Numeric> > _mat;int _col, _row;const bool usingModulo = true;const Numeric modulo = 1000000007; // using modulovoid resize(int col, int row) {_col = col; _row = row;_mat.assign(col, vector<Numeric>(row, 0));}public:Matrix(int col, int row) : _col(col), _row(row) {_mat.assign(col, vector<Numeric>(row, 0));}Matrix(int col, int row, int num) : _col(col), _row(row) {_mat.assign(col, vector<Numeric>(row, num));}int col() const { return _col; }int row() const { return _row; }vector<vector<Numeric>> mat() const {return _mat; }vector<Numeric> &operator[](int i) { return _mat[i]; }Numeric &operator() (int i, int j) { return _mat[i][j]; }Matrix<Numeric> &operator=(Matrix<Numeric> x) {this->_mat = x.mat();return *this;}Matrix<Numeric> operator+(Matrix<Numeric> &x) {if (this->col() != x.col() || this->row() != x.row()) {cout << "matrices are different sizes .. ";this->size(false); cout << "+"; x.size(true);exit(0);}Matrix<Numeric> ret(this->col(), this->row());for (int i = 0; i < this->col(); ++i) {for (int j = 0; j < this->row(); ++j) {ret[i][j] = _mat[i][j] + x[i][j];if (usingModulo) ret[i][j] %= modulo;}}return ret;}Matrix<Numeric> &operator+=(Matrix<Numeric> &x) {if (this->col() != x.col() || this->row() != x.row()) {cout << "matrices are different sizes .. ";this->size(false); cout << "+"; x.size(true);exit(0);}for (int i = 0; i < this->col(); ++i) {for (int j = 0; j < this->row(); ++j) {_mat[i][j] += x[i][j];if (usingModulo) _mat[i][j] %= modulo;}}return *this;}Matrix<Numeric> operator-(Matrix<Numeric> &x) {if (this->col() != x.col() || this->row() != x.row()) {cout << "matrices are different sizes .. ";this->size(false); cout << "-"; x.size(true);exit(0);}Matrix<Numeric> ret(this->col(), this->row());for (int i = 0; i < this->col(); ++i) {for (int j = 0; j < this->row(); ++j) {ret[i][j] = _mat[i][j] - x[i][j];if (usingModulo) ret[i][j] %= modulo;}}return ret;}Matrix<Numeric> &operator-=(Matrix<Numeric> &x) {if (this->col() != x.col() || this->row() != x.row()) {cout << "matrices are different sizes .. ";this->size(false); cout << "-"; x.size(true);exit(0);}for (int i = 0; i < this->col(); ++i) {for (int j = 0; j < this->row(); ++j) {_mat[i][j] -= x[i][j];if (usingModulo) _mat[i][j] %= modulo;}}return *this;}Matrix<Numeric> operator*(Matrix<Numeric> &x) {if (this->row() != x.col()) {cout << "cannot multiply matrices .. ";this->size(false); cout << "*"; x.size(true);exit(0);}Matrix<Numeric> ret(this->col(), x.row());for (int i = 0; i < this->col(); ++i) {for (int j = 0; j < x.row(); ++j) {for (int k = 0; k < this->row(); ++k) {ret[i][j] += _mat[i][k] * x[k][j];if (usingModulo) ret[i][j] %= modulo;}}}return ret;}Matrix<Numeric> &operator*(Numeric k) {Matrix<Numeric> ret(this->col(), this->row());for (int i = 0; i < this->col(); ++i) {for (int j = 0; j < this->row(); ++j) {ret(i, j) = _mat[i][j] * k;if (usingModulo) ret(i, j) %= modulo;}}return ret;}Matrix<Numeric> &operator*=(Matrix<Numeric> &x) {if (this->row() != x.col()) {cout << "cannot multiply matrices .. ";this->size(false); cout << "*"; x.size(true);exit(0);}Matrix<Numeric> ret(this->col(), x.row());for (int i = 0; i < this->col(); ++i) {for (int j = 0; j < x.row(); ++j) {for (int k = 0; k < this->row(); ++k) {ret[i][j] += _mat[i][k] * x[k][j];if (usingModulo) ret[i][j] %= modulo;}}}this->resize(this->col(), x.row());for (int i = 0; i < this->col(); ++i) {for (int j = 0; j < x.row(); ++j) {_mat[i][j] = ret[i][j];}}return *this;}Matrix<Numeric> &operator*=(Numeric k) {Matrix<Numeric> ret(this->col(), this->row());for (int i = 0; i < this->col(); ++i) {for (int j = 0; j < this->row(); ++j) {_mat[i][j] *= k;if (usingModulo) _mat %= modulo;}}return *this;}Numeric sum() {Numeric ret = 0;for (int i = 0; i < this->col(); ++i) {for (int j = 0; j < this->row(); ++j) {ret += _mat[i][j];if (usingModulo) ret %= modulo;}}return ret;}void print() {cout << "-- print "; this->size(false); cout << " --" << endl;for (int i = 0; i < _col; ++i) {for (int j = 0; j < _row; ++j) {if (j != 0) cout << "\t";cout << _mat[i][j];}cout << endl;}cout << "------------------" << endl;}void print(string str) {cout << "-- print \"" << str << "\" "; this->size(false); cout << " --" << endl;for (int i = 0; i < _col; ++i) {for (int j = 0; j < _row; ++j) {if (j != 0) cout << "\t";cout << _mat[i][j];}cout << endl;}cout << "------------------" << endl;}void size (bool endline = true) const {cout << "(" << this->col() << ", " << this->row() << ")";if (endline) cout << endl;}};int main() {long long a, b, n; cin >> a >> b >> n;Matrix<long long> ans(2, 1), x(2, 2);ans[0][0] = 1; ans[1][0] = 0;x[0][0] = a; x[0][1] = b;x[1][0] = 1; x[1][1] = 0;while (n) {if (n & 1) ans = x * ans;x *= x;n /= 2;}cout << ans[1][0] << endl;return 0;}