题目连接:https://codeforces.com/contest/1117/problem/D
题解:递推+矩阵快速幂
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e9+7;
ll n, m;
struct matrix{
ll m[105][105];
matrix(){
memset(m, 0, sizeof m);
}
};
matrix operator * (matrix a, matrix b){
matrix s;
memset(s.m, 0, sizeof s.m);
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
for(int k = 0; k < m; k++){
s.m[i][j] = (a.m[i][k] * b.m[k][j] % mod + s.m[i][j]) % mod;
}
}
}
return s;
}
matrix qkpow(matrix a, ll k){
matrix res;
for(int i = 0; i < m; i++){
res.m[i][i] = 1;
}
while(k){
if(k&1) res = res*a;
a = a * a;
k >>= 1;
}
return res;
}
int main(){
std::ios::sync_with_stdio(0);
cin >> n >> m;
matrix a;
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
if(i == j+1){
a.m[i][j] = 1;
}
else a.m[i][j] = 0;
}
}
a.m[0][0] = a.m[0][m-1] = 1;
matrix b = qkpow(a, n);
ll ans = (b.m[0][0]) % mod;
cout << ans << endl;
return 0;
}