【矩阵乘法】幼儿园数学题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); //模
} 

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/111702257