Submission #98365


Source Code Expand

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <cassert>
using namespace std;

#define all(c) (c).begin(), (c).end()
#define iter(c) __typeof((c).begin())
#define cpresent(c, e) (find(all(c), (e)) != (c).end())
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define tr(c, i) for (iter(c) i = (c).begin(); i != (c).end(); ++i)
#define pb(e) push_back(e)
#define mp(a, b) make_pair(a, b)

typedef long long ll;
const ll MOD = 1000000007;

typedef ll val_t;
typedef vector<val_t> poly_t;

#define NOR(x) ((x) % MOD)

poly_t poly_pow(const poly_t &a, ll k) {
  int n = a.size() - 1;
  poly_t p(n + 1), q(n * 2);
  p[0] = 1;
  for (int s = sizeof(ll) * 8 - __builtin_clzll(k) - 1; s >= 0; s--) {
    rep (i, n * 2) q[i] = 0;
    val_t r = p[n];
    int d = (k >> s) & 1;
    rep (i, n) {
      rep (j, n) q[i + j + d] = NOR(q[i + j + d] + p[i] * p[j]);
      r = NOR(r + p[i] * p[n]);
    }
    for (int i = 2 * n - 1; i >= n; i--) {
      rep (j, n) q[i - n + j] = NOR(q[i - n + j] + q[i] * a[j]);
      r = NOR(r + q[i] * a[n]);
    }
    rep (i, n) p[i] = q[i];
    p[n] = r;
  }
  return p;
}

ll solve(int K, int N) {
  if (N <= K) return 1;

  vector<ll> A(K + 1);
  rep (i, K) A[i] = 1;

  A = poly_pow(A, N - 1);
  ll s = 0;
  rep (i, K) (s += A[i]) %= MOD;
  return (s + MOD) % MOD;
}

ll solve_naive(int K, int N) {
  vector<ll> A(N + 10);
  for (int i = 1; i <= K; ++i) A[i] = 1;
  for (int i = K + 1; i <= N; ++i) {
    A[i] = 0;
    for (int j = 1; j <= K; ++j) (A[i] += A[i - j]) %= MOD;
  }
  return A[N];
}

int main() {
  int K, N;
  while (2 == scanf("%d%d", &K, &N)) {
    printf("%lld\n", solve(K, N));
    // assert(solve(K, N) == solve_naive(K, N));
  }

  return 0;
}

Submission Info

Submission Time
Task T - フィボナッチ
User iwiwi
Language C++ (G++ 4.6.4)
Score 8
Code Size 1991 Byte
Status AC
Exec Time 304 ms
Memory 1168 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 298 ms 1164 KB
01 AC 181 ms 1164 KB
02 AC 304 ms 1156 KB
03 AC 73 ms 1164 KB
04 AC 33 ms 1108 KB
90 AC 35 ms 1164 KB
91 AC 31 ms 1168 KB