YBTOJ:斐波拉契(矩阵快速幂)
生活随笔
收集整理的這篇文章主要介紹了
YBTOJ:斐波拉契(矩阵快速幂)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目描述
- 題目描述
- 代碼
題目描述
題目描述
關鍵在于如何轉化為本題的題目。。。
設
y=(1-根號5)/2$$
再令:
A(n)=xn +++ yn
通過嘗試可以發現,A其實就是一個1,3為前兩項的斐波拉契數列
則
xn=A(n)-yn
A的值可以用矩陣快速冪來求
而y是在(-1,0)的區間
所以分一下n的奇偶性,就可以求出答案了
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long const int mod=1e9+7; ll a,b,c,k; ll ans[4][4],res[4][4],trans[4][4]; void mul1(){//res*resmemset(trans,0,sizeof(trans));for(int i=1;i<=2;i++){for(int j=1;j<=2;j++){for(int p=1;p<=2;p++){trans[i][j]+=res[i][p]*res[p][j];trans[i][j]%=mod;}}}for(int i=1;i<=2;i++){for(int j=1;j<=2;j++){res[i][j]=trans[i][j];}} } void mul2(){//res*ansmemset(trans,0,sizeof(trans));for(int i=1;i<=2;i++){for(int j=1;j<=2;j++){for(int p=1;p<=2;p++){trans[i][j]+=ans[i][p]*res[p][j];trans[i][j]%=mod;}}}for(int i=1;i<=2;i++){for(int j=1;j<=2;j++){ans[i][j]=trans[i][j];}} } void ksm(ll w){while(w){if(w&1) mul2();mul1();w>>=1;}return; } void print(){for(int i=1;i<=2;i++){for(int j=1;j<=2;j++){printf("%d ",ans[i][j]);}printf("\n");} } int main() {ans[1][1]=ans[2][2]=1;res[1][1]=res[1][2]=res[2][1]=1;scanf("%lld",&a);if(a<=2) {printf("1");return 0;}ksm(a-2); // print();printf("%lld",(ans[1][1]+ans[2][1])%mod);return 0; }總結
以上是生活随笔為你收集整理的YBTOJ:斐波拉契(矩阵快速幂)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: YBTOJ:运动积分(trie树)
- 下一篇: 英雄联盟LOLS7法外狂徒男枪打野天赋符