結果
| 問題 |
No.194 フィボナッチ数列の理解(1)
|
| コンテスト | |
| ユーザー |
古寺いろは
|
| 提出日時 | 2015-04-26 22:40:16 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 39 ms / 5,000 ms |
| コード長 | 1,992 bytes |
| コンパイル時間 | 1,757 ms |
| コンパイル使用メモリ | 167,704 KB |
| 実行使用メモリ | 7,284 KB |
| 最終ジャッジ日時 | 2024-07-05 03:07:15 |
| 合計ジャッジ時間 | 3,410 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 37 |
ソースコード
#include "bits/stdc++.h"
using namespace std;
int dp[1000010];
long long mod = (int)1e9 + 7;
void calc(int N, long long K, vector<int> A){
long long sum2 = 0;
long long sum = 0;
for (int i = 0; i < N; i++)
{
dp[i] = A[i];
sum += A[i];
sum2 += A[i];
}
sum %= mod;
sum2 %= mod;
for (int i = N; i < K; i++)
{
dp[i] = sum;
sum -= dp[i - N];
sum += dp[i];
sum %= mod;
sum += mod;
sum %= mod;
sum2 += dp[i];
sum2 %= mod;
}
cout << dp[K - 1] << " " << sum2 << endl;
}
vector<vector<long long>> E(int N){
vector<vector<long long>> V(N, vector<long long>(N, 0));
for (int i = 0; i < N; i++)
{
V[i][i] = 1ll;
}
return V;
}
vector<vector<long long>> matrixmul(vector<vector<long long>> a, vector<vector<long long>> b){
int N = a[0].size();
vector<vector<long long>> V(N, vector<long long>(N, 0));
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
for (int k = 0; k < N; k++)
{
V[i][j] += a[i][k] * b[k][j];
V[i][j] %= mod;
}
V[i][j] %= mod;
}
}
return V;
}
vector<vector<long long>> matrixpow(vector<vector<long long>> a, long long p){
if (p == 0) return E(a[0].size());
if (p % 2 == 1){
return matrixmul(a, matrixpow(a, p - 1));
}
else{
auto c = matrixpow(a, p / 2);
return matrixmul(c, c);
}
}
void calc2(int N, long long K, vector<int> A){
vector<vector<long long>> V(N + 1, vector<long long>(N + 1, 0));
for (int i = 0; i < N; i++)
{
if(i != 0) V[i - 1][i] = 1;
V[N - 1][i] = 1;
V[N][i] = 1;
}
V[N][N] = 1;
long long sum = 0;
for (int i = 0; i < N; i++)
{
sum += A[i];
sum %= mod;
}
long long ans = 0;
auto next = matrixpow(V, K - N);
for (int i = 0; i < N; i++)
{
ans += A[i] * next[N - 1][i];
sum += A[i] * next[N][i];
}
ans %= mod;
sum %= mod;
cout << ans << " " << sum << endl;
}
int main() {
int N;
long long K;
cin >> N >> K;
vector<int> A(N);
for (int i = 0; i < N; i++)
{
cin >> A[i];
}
if (K <= 1000000) calc(N, K, A);
else calc2(N, K, A);
}
古寺いろは