結果
| 問題 |
No.891 隣接3項間の漸化式
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-09-20 21:46:57 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 1,377 bytes |
| コンパイル時間 | 1,917 ms |
| コンパイル使用メモリ | 177,352 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-14 17:09:01 |
| 合計ジャッジ時間 | 3,069 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 39 |
ソースコード
#include <bits/stdc++.h>
using namespace std::literals::string_literals;
using i64 = long long;
using std::cout;
using std::endl;
using std::cin;
template<typename T>
std::vector<T> make_v(size_t a){return std::vector<T>(a);}
template<typename T,typename... Ts>
auto make_v(size_t a,Ts... ts){
return std::vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...));
}
struct matrix {
std::vector<std::vector<i64>> A;
const int MOD = 1e9 + 7;
matrix(const int & n) {
A.resize(n, std::vector<i64>(n));
}
matrix operator*(matrix B) {
const int n = A.size();
matrix C(n);
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
(C[i][j] += A[i][k] * B[k][j] % MOD) %= MOD;
}
}
}
return C;
}
void pow(i64 n) {
int d = A.size();
matrix ret(d);
for(int i = 0; i < d; i++) ret[i][i] = 1;
while(n) {
if(n & 1) ret = ret * (*this);
(*this) = (*this) * (*this);
n >>= 1;
}
(*this) = ret;
}
void operator=(matrix B) {
A.swap(B.A);
}
std::vector<i64> & operator[](const int & i) {
return A[i];
}
};
int main() {
i64 a, b, n; scanf("%lld%lld%lld", &a, &b, &n);
if(n == 0) {
printf("0\n");
return 0;
}
if(n == 1) {
printf("1\n");
return 0;
}
matrix A(2);
A[0][0] = a;
A[0][1] = b;
A[1][0] = 1;
A[1][1] = 0;
A.pow(n - 1);
printf("%lld\n", A[0][0]);
return 0;
}