【矩阵乘法】幼儿园数学题Ⅱ

链接

S S L   2514 SSL\ 2514 SSL 2514

题目描述

求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(n1)+f(n2)+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]); 
}

猜你喜欢

转载自blog.csdn.net/LTH060226/article/details/111711663