【矩阵乘法】斐波拉契数列IV

Description

求数列f[n]=f[n-2]+f[n-1]+n+1的第N项,其中f[1]=1,f[2]:=1.

Input

N(1<N<2^31-1)

Output

第n项结果 mod 9973

Sample Input
10000
Sample Output
4399

解题思路

详情参见斐波拉契数列II斐波拉契数列III

累了,疲惫了
A矩阵为
在这里插入图片描述
B矩阵为
在这里插入图片描述


Code

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int Mod = 9973;
long long n;

struct DT{
    
    
	int n, m;
	int aed[5][5];
}A, B, Ac;

DT operator *(DT a, DT b){
    
    
	DT c;
	c.n = a.n, c.m = b.m;
	memset (c.aed, 0, sizeof (c.aed));
	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.aed[i][j] = (c.aed[i][j] + a.aed[i][k] * b.aed[k][j] % Mod) % Mod;
	return c;
}

void power (long long n){
    
    
	if (n == 1)
	{
    
    
		Ac = A;
		return;
	}
	power (n / 2);
	Ac = Ac * Ac;
	if (n % 2) Ac = Ac * A; 
}

int main(){
    
    
	A.n = A.m = 4;
	A.aed[1][2] = A.aed[2][1] = A.aed[2][2] = A.aed[3][2] = A.aed[3][3] = 1;
	A.aed[4][2] = A.aed[4][3] = A.aed[4][4] = 1;
	B.n = 1, B.m = 4;
	B.aed[1][1] = B.aed[1][2] = B.aed[1][4] = 1;
	B.aed[1][3] = 3;
	scanf ("%lld", &n);
	power (n - 1);
	B = B * Ac;
	printf ("%d", B.aed[1][1]);
}

猜你喜欢

转载自blog.csdn.net/qq_39940018/article/details/111058720