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

Link------------


题目大意

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); //模
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值