洛谷1349 廣義斐波那契數列 矩陣乘法

2021-07-10 20:53:09 字數 1551 閱讀 6264

洛谷1349 廣義斐波那契數列

題目描述

廣義的斐波那契數列是指形如an=p*an-1+q*an-2的數列。今給定數列的兩係數p和q,以及數列的最前兩項a1和a2,另給出兩個整數n和m,試求數列的第n項an除以m的餘數。

輸入輸出格式

輸入格式:

輸入包含一行6個整數。依次是p,q,a1,a2,n,m,其中在p,q,a1,a2整數範圍內,n和m在長整數範圍內。

輸出格式:

輸出包含一行乙個整數,即an除以m的餘數。

輸入輸出樣例

輸入樣例#1:

1 1 1 1 10 7

輸出樣例#1:6說明

數列第10項是55,除以7的餘數為6。

【思路】

矩陣乘法。

n最大為maxlongint所以列舉肯定會有tle。

這裡用到了矩陣乘法。大體思想:因為每次的求解規則相同,所以可以構造乙個轉移矩陣,使得每個點與該矩陣相乘即可直接得出最終該點的位置。

開始矩陣b:

a2 a1

構造矩陣如下:

p 1q 0

(一次轉換後為 p*a2+q*a1,a2 )

因為要進行n-2次相同的轉換所以用快速冪求解轉換n-2次後的a』 。

ans=b*a'

注意: 矩陣乘法的順序不能更改,否則可能不滿足乘法要求。

ll 與 ll的乘法可能會爆精度,可以轉化為小數相加的形式。

**思想源於洛谷題解。

【**】

1 #include2 #include3

using

namespace

std;

45 typedef long

long

ll;6

const

int delen=23,delta=1

<<23,deltb=delta-1;7

ll n,m,p,q,a1,a2;89

ll add(ll x,ll y)

1415 ll multi(ll x,ll y)

22return

ans;23}

2425

struct

matrix;

30 tmp.r=r, tmp.c=rhs.c;

31for(int i=0;i)

32for(int j=0;j)

36return

tmp;37}

3839 matrix pow(ll p) const

, tmp=*this

;41 ans.r=ans.c=r;

42for(int i=0;i1;43

while

(p)

48return

ans;49}

50};

5152

intmain()

洛谷1349 廣義斐波那契數列

廣義的斐波那契數列是指形如an p an 1 q an 2的數列。今給定數列的兩係數p和q,以及數列的最前兩項a1和a2,另給出兩個整數n和m,試求數列的第n項an除以m的餘數。輸入包含一行6個整數。依次是p,q,a1,a2,n,m,其中在p,q,a1,a2整數範圍內,n和m在長整數範圍內。輸出包含...

洛谷 P1349廣義斐波那契

題意 現在定義fib數列為 an p an 1 q an 2求第n項 m的答案。題解 begin p 1 q 0 end begin f n 1 f n 2 end begin p f n 1 q f n 2 f n 1 end begin f n f n 1 end 這題有個玄學mod。矩陣乘法的...

Luogu P1349 廣義斐波那契數列

既然廣義斐波那契,而且資料範圍這麼大,那麼我們使用矩陣快速冪來進行求解。大家都知道斐波那契的初始矩陣如下 begin1 1 1 0 end 那麼這道題我們怎麼推矩陣呢?先確定目標矩陣如下 begin f n f end 然後推導過程如下 f n p times f q times f beginf ...