Advertisement
999ms

Untitled

Oct 30th, 2019
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define all(x) (x).begin(),(x).end()
  3.  
  4. using namespace std;
  5. using ll = long long;
  6. using vvll = vector<vector<ll>>;
  7.  
  8. const ll MOD = 1e9 + 7;
  9.  
  10.  
  11. void Mult(vvll& A, vvll& B, vvll& C, int n) {
  12.     for (int i = 0; i < n; i++) {
  13.         for (int j = 0; j < n; j++) {
  14.             A[i][j] = 0;
  15.         }
  16.     }
  17.     for (int i = 0; i < n; i++) {
  18.         for (int j = 0; j < n; j++) {
  19.             for (int k = 0; k < n; k++) {
  20.                 A[i][k] += B[i][j] * C[j][k];
  21.                 if (A[i][k] >= MOD) {
  22.                     A[i][k] %= MOD;
  23.                 }
  24.             }
  25.         }
  26.     }
  27. }
  28.  
  29. void Set(vvll& a, vvll& b, int n) {
  30.     for (int i = 0; i < n; i++) {
  31.         for (int j = 0; j < n; j++) {
  32.             a[i][j] = b[i][j];
  33.         }
  34.     }
  35. }
  36.  
  37. vector<vector<ll>> A, ANS, Buffer1, Buffer2;
  38.  
  39.  
  40. int main() {
  41.     ll n;
  42.     int c;
  43.     cin >> n >> c;
  44.     c++;
  45.     A.assign(c, vector<ll>(c, 0));
  46.     ANS.assign(c, vector<ll>(c, 0));
  47.     Buffer1.assign(c, vector<ll>(c, 0));
  48.     Buffer2.assign(c, vector<ll>(c, 0));
  49.     for (int i = 0; i < c; i++) {
  50.         ANS[i][i] = 1;
  51.     }
  52.     for (int i = 1; i < c; i++) {
  53.         A[i][i - 1] = 1;
  54.     }
  55.     for (int i = 0; i < c; i++) {
  56.         A[0][i] = 1;
  57.     }
  58.  
  59.     while (n) {
  60.         if (n & 1) {
  61.             Set(Buffer1, ANS, c);
  62.             Mult(ANS, Buffer1, A, c);
  63.         }
  64.         n /= 2;
  65.         Set(Buffer1, A, c);
  66.         Set(Buffer2, A, c);
  67.         Mult(A, Buffer1, Buffer2, c);
  68.     }
  69.     ll ans = 0;
  70.     for (int i = 0; i < c; i++) {
  71.         ans += ANS[i][0];
  72.         ans %= MOD;
  73.     }
  74.     cout << ans << endl;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement