链接
题目描述
求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 的f的前n项
样例输入
2
样例输出
2
思路
把式子移项可得 f ( n ) = f ( n − 1 ) + f ( n − 2 ) + n + 1 f(n)=f(n-1)+f(n-2)+n+1 f(n)=f(n−1)+f(n−2)+n+1
然后矩阵乘法即可
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
const ll mo = 1000000007;
ll n;
struct matrix
{
ll n, m;
ll a[10][10];
}a, b, ans, c;
matrix operator *(matrix a, matrix b)
{
c.n = a.n;
c.m = b.m;
for(int i = 1; i <= c.n; ++i)
for(int j = 1; j <= c.m; ++j)
c.a[i][j] = 0;
for(int k = 1; k <= a.m; ++k)
for(int i = 1; i <= c.n; ++i)
for(int j = 1; j <= c.m; ++j)
c.a[i][j] = (c.a[i][j] + (a.a[i][k] * b.a[k][j]) % mo) % mo;
return c;
}
void ksm(ll k)
{
b = a;
k--;
while(k)
{
if(k & 1) b = b * a;
a = a * a;
k /= 2;
}
}
int main()
{
scanf("%d", &n);
if(n == 1) {
printf("1");
return 0;
}
ans.n = 1; ans.m = 5;
a.n = 5; a.m = 5;
ans.a[1][3] = 3;
ans.a[1][1] = ans.a[1][2] = ans.a[1][4] = ans.a[1][5] = 1;
a.a[1][1] = a.a[2][1] = a.a[3][1] = a.a[4][1] = 1;
a.a[1][2] = a.a[3][3] = a.a[4][3] = a.a[4][4] = 1;
a.a[1][5] = a.a[5][5] = 1;
ksm(n - 1);
ans = ans * b;
printf("%lld", ans.a[1][5]);
}