题目大意
f(n)-f(3)-f(4)-f(5)-…-f(n-3)-f(n-2)=(n+4)(n-1)/2,f(1)=1,f(2)=1。
求前 n 项和。
通过移项,可得 f(n)=f(n-1)+f(n-2)+n+1
于是可以便构建矩阵,快速幂求解了。
代码
#include<cstdio>
long long n;
struct asdf{
long long n,m;
long long k[7][7];
} A,B,C;
asdf operator *(asdf aa, asdf bb){
//矩阵乘法
asdf cc;
cc.n = aa.n;
cc.m = bb.m;
for(long long i = 1; i <= cc.n; ++i)
for(long long j = 1 ;j <= cc.m; ++j)
cc.k[i][j] = 0;
for(long long i = 1; i <= cc.n; ++i)
for(long long j = 1; j <= cc.m; ++j)
for(long long l = 1; l <= aa.m; ++l)
cc.k[i][j] = (cc.k[i][j] + aa.k[i][l] * bb.k[l][j] % 1000000007) % 1000000007;
return cc;
}
asdf ksm(long long l){
//矩阵快速幂
if(l == 1) return A;
asdf ll = ksm(l/2);
if(l % 2 == 0) return ll * ll;
return ll * ll * A;
}
int main(){
scanf("%lld",&n);
if(n <= 2) {
printf("%lld",n);
return 0;
}
A.n = 5; A.m = 5; //赋初始值
A.k[1][1] = A.k[2][1] = A.k[3][1] = A.k[4][1] = A.k[1][2] = A.k[3][3] = A.k[4][3] = A.k[4][4] = 1;
A.k[5][5] = A.k[1][5] = A.k[2][5] = A.k[3][5] = A.k[4][5] = 1;
B = ksm(n-2);
C.n = 1; C.m = 5;
C.k[1][1] = C.k[1][2] = C.k[1][4]= 1;
C.k[1][3] = 3; C.k[1][5] = 2;
C = C * B;
printf("%lld",C.k[1][5]% 1000000007); //模
}