Submission #106415


Source Code Expand

#include <iostream>
#include <vector>

using namespace std;

typedef long long LL;

const LL MOD = 1000000007;

void add(LL &var, LL val) {
    var = (var + val%MOD) % MOD;
}

int K;
vector<vector<LL>> fact;
vector<LL> dbl(const vector<LL> &v) {
    vector<LL> tmp(K*2, 0);
    for(int i = 0; i < K; ++i) {
        for(int j = 0; j < K; ++j) {
            add(tmp[i+j], v[i]*v[j]);
        }
    }
    for(int i = K; i < K*2; ++i) {
        for(int j = 0; j < K; ++j) {
            add(tmp[j], tmp[i]*fact[i][j]);
        }
    }
    tmp.resize(K);
    return tmp;
}

vector<LL> inc(const vector<LL> &v) {
    vector<LL> tmp(K+1, 0);
    for(int i = 0; i < K; ++i) {
        tmp[i+1] = v[i];
    }
    for(int j = 0; j < K; ++j) {
        add(tmp[j], tmp[K]*fact[K][j]);
    }
    tmp.resize(K);
    return tmp;
}

vector<LL> modpow(const vector<LL> &v, int N) {
    if(N == 1) return v;
    if(N == 2) return inc(v);
    vector<LL> tmp = dbl(modpow(v, N/2));
    if(N % 2 == 1) tmp = inc(tmp);
    return tmp;
}

int main() {
    int N;
    cin >> K >> N;

    fact.resize(K*2);
    // [0, K)
    for(int i = 0; i < K; ++i) {
        fact[i].resize(K, 0);
        fact[i][i] = 1;
    }
    // [K, K+1)
    fact[K].resize(K, 0);
    for(int i = 0; i < K; ++i) {
        fact[K][i] = 1;
    }
    // [K+1, 2K)
    for(int i = K+1; i < 2*K; ++i) {
        fact[i].resize(K, 0);
        for(int j = 0; j < K; ++j) {
            add(fact[i][j], fact[i-1][j]*2);
        }
        for(int j = 0; j < K; ++j) {
            fact[i][j] = (fact[i][j] - fact[i-K-1][j] + MOD) % MOD;
        }
    }

    vector<LL> vec(K, 0);
    vec[1] = 1;
    vec = modpow(vec, N-1);
    LL ans = 0;
    for(LL l : vec) {
        add(ans, l);
    }
    cout << ans << endl;
    return 0;
}

Submission Info

Submission Time
Task T - フィボナッチ
User osak
Language C++11 (GCC 4.8.1)
Score 8
Code Size 1853 Byte
Status AC
Exec Time 566 ms
Memory 16544 KB

Judge Result

Set Name All
Score / Max Score 8 / 8
Status
AC × 7
Set Name Test Cases
All 00, 01, 02, 03, 04, 90, 91
Case Name Status Exec Time Memory
00 AC 566 ms 16484 KB
01 AC 328 ms 10528 KB
02 AC 564 ms 16424 KB
03 AC 105 ms 3244 KB
04 AC 201 ms 16544 KB
90 AC 22 ms 756 KB
91 AC 22 ms 800 KB