題意:定義乙個函式g(x),g(x)=f(f(x)),其中f(x)為斐波那契數列的第x項,f(0)=f(1)=1。給定x求g(x)。答案模1e9+7。x<=1e100。
我們可以知道,在x很大的情況下,在模意義下斐波那契會出現迴圈,我們可以寫乙個打表程式判斷迴圈節,發現是每2*1e9+16個數迴圈。這樣我們可以求出f(x)在x<=1e100時斐波那契數列的第x項,那麼我們如何求g(x)呢?我們可以再打一遍,求出斐波那契數列在模2*1e9+16意義下的迴圈節,又得到了乙個數是329616。於是我們先將x模329616,然後再用矩陣乘法求出在模2*1e9+16的斐波那契數列的第x項,令其為b,然後求在模1e9+7的意義下斐波那契數列的第b項,即為答案。
#include#include#includeusing namespace std;
#define mo 329616
long long ans[3][3],f[3][3],h[3][3];
long long mod[2]=;
long long a,b,c;
int t;
void qpower(long long b,int w)
memset(h,0,sizeof h);
for (int i=1;i<=2;i++)
for (int j=1;j<=2;j++)
for (int k=1;k<=2;k++)
h[i][j]=(h[i][j]+f[i][k]*f[k][j])%mod[w];
memcpy(f,h,sizeof h); }}
int main()
ans[2][2]=1;ans[1][1]=ans[1][2]=ans[2][1]=0;
f[1][2]=f[2][1]=f[2][2]=1;f[1][1]=0;
qpower(b,1);
b=ans[2][1];
ans[2][2]=1;ans[1][1]=ans[1][2]=ans[2][1]=0;
f[1][2]=f[2][1]=f[2][2]=1;f[1][1]=0;
qpower(b,0);
printf("%lld\n",ans[2][1]);
} return 0;
}
矩陣快速冪 斐波那契數列
time limit 1000 ms memory limit 128 mb 通過小l的不懈努力,他即將成為大神啦,他登上了大神專屬的頒獎臺。在頒獎台上,他即將領取代表著大神的無限榮譽的勳章。小l走上頒獎台後,在台上發現了乙個製作精美的盒子。榮譽勳章就在盒子裡面。小l發現這個盒子被上了鎖,在這個盒子...
矩陣快速冪 斐波那契數列
先來實現乙個矩陣相乘的函式吧。const int mod 10000 struct mat mat mat mul mat x,mat y 實現兩個矩陣相乘,返回的還是乙個矩陣。return res 其實和普通快速冪類似,只不過這裡需要得到的是乙個矩陣下面來實現乙個矩陣快速冪 int pow int...
斐波那契數列 矩陣快速冪
輸入格式 輸入乙個正整數n 1 n 1e18 輸出格式 輸出乙個數,數列的第n項 輸入樣例1 1輸出樣例1 1輸入樣例2 3輸出樣例2 2 一 矩陣相乘 若a為n k矩陣,b為k m矩陣,則它們的乘積將是乙個n m矩陣。兩個矩陣能相乘的前提條件為前乙個矩陣的列數等於後乙個矩陣的行數。兩矩陣相乘的 如...