rt,我采用的矩阵是这样的:
(fifi−1...fi−m+1)×1001100001000010
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define Mod 1000000007
struct node{
ll a[105][105];
int n,m;
node(){
memset(a,0,sizeof(a));
}
}a,b;
node read(int n,int m){
node c;
c.n=n,c.m=m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) cin>>c.a[i][j];
return c;
}
node operator*(node x,node y){
node c;
int n=x.n,m=x.m,q=y.m;
c.n=n,c.m=q;
for(int i=1;i<=n;i++)
for(int j=1;j<=q;j++)
for(int k=1;k<=m;k++)
c.a[i][j]=(c.a[i][j]+x.a[i][k]*y.a[k][j])%Mod;
return c;
}
node operator^(node x,ll y){
node c;c.n=c.m=x.n;
for(int i=1;i<=c.n;i++) c.a[i][i]=1;
while(y){
if(y&1) c=c*x;
x=x*x,y>>=1;
}
return c;
}
int main(){
int m;
ll n;
cin>>n>>m;
if(n<m){
cout<<1;
return 0;
}
b.n=b.m=m,b.a[1][1]=b.a[m][1]=1;
for(int i=1;i<=m;i++) a.a[1][i]=1;
for(int i=2;i<=m;i++) b.a[i-1][i]=1;
a.n=1,a.m=m;
a=a*(b^(n-m-1));
cout<<a.a[1][1];
return 0;
}