結果

問題 No.891 隣接3項間の漸化式
ユーザー potoooooooo
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#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 modulo
void 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;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0