P1939 矩陣加速(數列)

2022-02-19 05:54:12 字數 1156 閱讀 4030

這個題若不看題目和範圍,我首先想到用遞推,不過   n≤2×10^9,若用遞推,一定會超時。

要用矩陣加速的話首先要找到乙個矩陣(不唯一),用來相乘;

〔a1,a2,a3〕是乙個1×3的矩陣,我想把它轉化為〔a2,a3,a4〕也是乙個1×3的矩陣,所以要找的矩陣肯定是3×3的;

可以假設這個3×3的矩陣為

所以 a2=a1×a+a2×b+a3×c 所以a=0;b=1;c=0;同理可得d=0;e=0;f=1;

a4=a3+a1 所以 g=1;h=0;i=1;所以3×3的矩陣應為

可以看出若想得出an,則需要這個矩陣的(n-3)次方再乘

〔a1,a2,a3〕因為a1,a2,a3都為1,所以可以不用乘,最後得出〔a n-2,a n-1,a n〕;用 r[4][4]來儲存乘完後的3×3矩陣,

則an就是 r[1][3]+r[2][3]+r[3][3];通過快速冪就能快速求出答案了。

直接上完整**:

1 #include2

using

namespace

std;

3struct

hls;

6hls t,r;

7long

longk;8

const

long

long m=1000000007

;9 hls operator * (const hls &a,const hls &b)

1018}19

for(int x=1;x<=3;++x)

2028}29

}30return

w;31}32

intmain()

3347

}48 t.s[1][3]++;

49 t.s[2][1]++;

50 t.s[3][2]++;

51 t.s[3][3]++;

52 k=k-3;53

while(k>0

) 54

59 cout<

61return0;

62 }

P1939 模板 矩陣加速(數列)

題目描述 a 1 a 2 a 3 1 a x a x 3 a x 1 x 3 求a數列的第n項對1000000007 10 9 7 取餘的值。輸入格式 第一行乙個整數t,表示詢問個數。以下t行,每行乙個正整數n。輸出格式 每行輸出乙個非負整數表示答案。輸入輸出樣例 輸入 1 複製36 810輸出 1...

P1939 模板 矩陣加速(數列)

a 1 a 2 a 3 1 a x a x 3 a x 1 x 3 求a數列的第n項對1000000007 10 9 7 取餘的值。輸入格式 第一行乙個整數t,表示詢問個數。以下t行,每行乙個正整數n。輸出格式 每行輸出乙個非負整數表示答案。輸入樣例 1 368 10輸出樣例 1 4919 對於30...

P1939 模板 矩陣加速(數列)

已知乙個數列 aa,它滿足 a x begin 1 x in a a x geq 4 endax x 4 求 aa 數列的第 nn 項對 10 9 7109 7 取餘的值。第一行乙個整數 tt,表示詢問個數。以下 tt 行,每行乙個正整數 nn。每行輸出乙個非負整數表示答案。includeusing...