結果
| 問題 |
No.891 隣接3項間の漸化式
|
| コンテスト | |
| ユーザー |
tekihei2317
|
| 提出日時 | 2019-09-21 11:38:53 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 2,346 bytes |
| コンパイル時間 | 1,767 ms |
| コンパイル使用メモリ | 173,104 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-17 15:03:53 |
| 合計ジャッジ時間 | 3,281 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 39 |
ソースコード
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
template<class T>
struct Matrix
{
vector<vector<T>> A;
Matrix(){}
Matrix(int n,int m):A(n,vector<T>(m,0)){}
Matrix(int n):A(n,vector<T>(n,0)){};
int height() const{
return (A.size());
}
int width() const{
return (A[0].size());
}
inline const vector<T> &operator[](int k) const{
return (A.at(k));
}
inline vector<T> &operator[](int k){
return (A.at(k));
}
static Matrix I(int n){
Matrix mat(n);
for(int i=0;i<n;i++) mat[i][i]=1;
return (mat);
}
Matrix &operator+=(const Matrix &B){
int n=height(), m=width();
assert(n==B.height() && m==B.width());
for(int i=0;i<n;i++) for(int j=0;j<m;j++){
(*this)[i][j]+=B[i][j];
}
return (*this);
}
Matrix &operator-=(const Matrix &B){
int n=height(), m=width();
assert(n==B.height() && m==B.width());
for(int i=0;i<n;i++) for(int j=0;j<m;j++){
(*this)[i][j]-=B[i][j];
}
return (*this);
}
Matrix &operator*=(const Matrix &B){
int n=height(), m=B.width(), p=width();
assert(p==B.height());
vector<vector<T>> C(n,vector<T>(m,0));
for(int i=0;i<n;i++) for(int j=0;j<m;j++){
for(int k=0;k<p;k++){
C[i][j]=(C[i][j]+(*this)[i][k]*B[k][j]);
C[i][j]%=mod;
}
}
A.swap(C);
return (*this);
}
Matrix &operator^=(int k){
Matrix B=Matrix::I(height());
while(k>0){
if(k&1) B*=*this;
*this*=*this;
k>>=1;
}
A.swap(B.A);
return (*this);
}
Matrix operator+(const Matrix &B) const{
return (Matrix(*this)+=B);
}
Matrix operator-(const Matrix &B) const{
return (Matrix(*this)-=B);
}
Matrix operator*(const Matrix &B) const{
return (Matrix(*this)*=B);
}
Matrix operator^(const int k) const{
return (Matrix(*this)^=k);
}
};
signed main()
{
cin.tie(0);
ios::sync_with_stdio(false);
int a,b,n; cin>>a>>b>>n;
Matrix<int> A(2);
A[0][0]=a; A[0][1]=b;
A[1][0]=1; A[1][1]=0;
A^=n;
cout<<A[1][0]<<endl;
return 0;
}
tekihei2317