1. 程式人生 > 其它 >【矩陣乘法】斐波拉契數列IV

【矩陣乘法】斐波拉契數列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]); }