日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

又见斐波那契~矩阵快速幂入门题

發(fā)布時(shí)間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 又见斐波那契~矩阵快速幂入门题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鏈接:https://www.nowcoder.com/acm/contest/105/G
來(lái)源:牛客網(wǎng)

題目描述

這是一個(gè)加強(qiáng)版的斐波那契數(shù)列。
給定遞推式 求F(n)的值,由于這個(gè)值可能太大,請(qǐng)對(duì)109+7取模。

輸入描述:

第一行是一個(gè)整數(shù)T(1 ≤ T ≤ 1000),表示樣例的個(gè)數(shù)。
以后每個(gè)樣例一行,是一個(gè)整數(shù)n(1 ≤ n ≤ 10 18)。

輸出描述:

每個(gè)樣例輸出一行,一個(gè)整數(shù),表示F(n) mod 1000000007。 示例1

輸入

4 1 2 3 100

輸出

1 16 57 558616258

這題是一題矩陣快速冪的模板題,表示第一次碰到矩陣快速冪然后就順便學(xué)一下,其實(shí)和快速冪差不多。
矩陣快速冪的難點(diǎn)一般是構(gòu)造矩陣,但是這題遞推公式給了我們還是非常容易構(gòu)造出矩陣的。
難題一般都是讓我們自己去推公式,然后再通過公式寫出所需要的矩陣。 遞推公式給了我們,
就是要找到一個(gè)矩陣A 【f(i),f(i-1),(i+1)^3,(i+1)^2,(i+1),1】 * A =【f(i-1),f(i-2),i^3,i^2,i,1】;
如果學(xué)過線代,這個(gè)是非常容易推出來(lái)的。
然后就通過矩陣的性質(zhì), F【n】=A^(n-1)*F【1】;
知道這些,就會(huì)發(fā)現(xiàn)這不就是一個(gè)SB題嗎

1 #include <cstdio> 2 #include <algorithm> 3 #include <vector> 4 #include <queue> 5 #include <cstring> 6 #include <string> 7 using namespace std; 8 const int maxn = 1e2 + 10; 9 const int mod = 1e9 + 7; 10 typedef long long LL ; 11 struct mat 12 { 13 LL m[maxn][maxn]; 14 mat() { 15 memset(m,0,sizeof(m)); 16 } 17 mat operator * (mat &a ) { 18 mat ans; 19 for (int i=0 ;i<6 ;i++ ){ 20 for (int j=0 ;j<6 ;j++) { 21 for (int k=0 ;k<6 ;k++) { 22 ans.m[i][j]=(ans.m[i][j]+m[i][k]*a.m[k][j])%mod; 23 } 24 } 25 } 26 return ans; 27 } 28 }; 29 mat modexp(mat a,LL b) 30 { 31 mat ans; 32 for (int i=0 ;i<6 ;i++ ) ans.m[i][i]=1; 33 while(b) { 34 if (b&1) ans=ans*a; 35 b=b>>1; 36 a=a*a; 37 } 38 return ans; 39 } 40 int main() { 41 long long mm[6][6] = { 42 {1, 1, 1, 1, 1, 1}, 43 {1, 0, 0, 0, 0, 0}, 44 {0, 0, 1, 3, 3, 1}, 45 {0, 0, 0, 1, 2, 1}, 46 {0, 0, 0, 0, 1, 1}, 47 {0, 0, 0, 0, 0, 1} 48 }; 49 int t; 50 scanf("%d", &t); 51 while(t--) { 52 LL n; 53 mat ans; 54 for (int i = 0 ; i < 6 ; i++) { 55 for (int j = 0 ; j < 6 ; j++) { 56 ans.m[i][j] = mm[i][j]; 57 } 58 } 59 scanf("%lld", &n); 60 ans = modexp(ans, n - 1); 61 printf("%lld\n", (ans.m[0][0] + ans.m[0][2] * 8 + ans.m[0][3] * 4 + ans.m[0][4] * 2 + ans.m[0][5]) % mod); 62 } 63 return 0; 64 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/qldabiaoge/p/8971714.html

總結(jié)

以上是生活随笔為你收集整理的又见斐波那契~矩阵快速幂入门题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。