1. 程式人生 > >【矩陣快速冪】HDU 4549 : M斐波那契數列(矩陣巢狀)

【矩陣快速冪】HDU 4549 : M斐波那契數列(矩陣巢狀)

【題目大意】

M斐波那契數列F[n]是一種整數數列,它的定義如下:

F[0] = a
F[1] = b
F[n] = F[n-1] * F[n-2] ( n > 1 )

現在給出a, b, n,你能求出F[n]的值嗎?對每組測試資料請輸出一個整數F[n],由於F[n]可能很大,你只需輸出F[n]對1000000007取模後的值即可,每組資料輸出一行。

【Source】 :2013金山西山居創意遊戲程式挑戰賽――初賽(2)

【解題思路】

這個題稍微有點難度,就是要考慮矩陣裡面巢狀矩陣,這樣的話,我們就要分別計算左右兩邊的值,然後再用一次快速冪求出最後的答案,

思考如下:
寫出F(2)、F(3)、F(4)、F(5)…會發現a和b的指數是fibonacci數,如果求出fib數列,用快速冪就可以快速求出最後答案。問題轉化為了如何快速求解fib數列。 因為【F(n-2),F(n-1)】*【0,1,1,1】 = 【F(n-1),F(n)】,所以可以用矩陣乘法來求。 每次相乘的矩陣為 0 1 1 1 為了防止求F(n)時溢位,要對矩陣元素取模,即 a[i][j] %= 1000000006。模數之所以為1000000006是因為根據

費馬小定理可得A^euler(M) = 1 (mod M),其中M為素數。 所以A^N = A^(N % euler(M))(mod M),而1000000007為數,euler(1000000007)= 1000000006,所以模數是1000000006。 求出F(n-1)和F(n)以後,用二分快速冪求出pow(a,F(n-1))* pow(b,F(n))% 1000000007 就是最後的答案。

程式碼

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const int MOD1=1e9+7;
const int MOD2=1e9+6;
#define LL long long
struct Matrlc
{
    LL map[2][2];
};
Matrlc unit = {1,0,0,1};
Matrlc mult(Matrlc a,Matrlc b)
{
    Matrlc c;
    for(int i=0; i<2; i++)
        for(int j=0; j<2; j++)
        {
            c.map[i][j]=0;
            for(int k=0; k<2; k++)
                c.map[i][j]+=(a.map[i][k]*b.map[k][j])%MOD2;
            c.map[i][j]%=MOD2;
        }
    return c;
}
Matrlc pow1(Matrlc a,LL n)
{
    Matrlc ans=unit;
    Matrlc res=a;
    while(n)
    {
        if(n&1)   ans=mult(ans,res);
        res=mult(res,res);
        n>>=1;
    }
    return ans;
}
LL pow2(LL a,LL b)
{
    LL res=1;
    LL ans=a%MOD1;
    while(b)
    {
        if(b&1) res=res*ans%MOD1;
        ans=ans*ans%MOD1;
        b>>=1;
    }
    return res;
}
int main()
{
    LL A,B,N,i,j;
    Matrlc tmp;
    tmp.map[0][0]=0;
    tmp.map[0][1]=tmp.map[1][0]=tmp.map[1][1]=1;
    while(cin>>A>>B>>N)
    {
        Matrlc p=pow1(tmp,N);
        LL result=pow2(A,p.map[0][0])*pow2(B,p.map[0][1])%MOD1;
        printf("%lld\n",result);
    }
    return 0;
}


相關推薦

矩陣快速HDU 4549 : M數列矩陣

【題目大意】 M斐波那契數列F[n]是一種整數數列,它的定義如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 現在給出a,

HDU 4549 M數列矩陣快速

題目連結:M斐波那契數列 列舉幾項會發現$ F[n]=a^{fib(n-1)} * b^{fib(n)} $ 斐波那契數列用矩陣快速冪求即可。但是因為n很大,fib會爆掉。這時候可以引入費馬小定理。 證明:$a^x \% p = a^{x \%(p-1)} \%p$ 1.$a^x \% p = a^{

HDU 4549 M數列 矩陣快速+費馬小定理

思路: 通過列出幾項我們就可以發現ab的指數是斐波那契數列。然後博主就開(智)心(障)的用矩陣快速冪算指數了。。 卻忘了一件事。。。誰說的取模對指數封閉的啊???md瘋狂wa了六七次。 取模對乘法

HDU 4549 M數列 矩陣快速 + 費馬小定理

M斐波那契數列F[n]是一種整數數列,它的定義如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 現在給出a, b, n,你能求出F[n]的值嗎? Input 輸入包含多組測試資料; 每組資料佔一行,包含3個

HDU 4549 M數列矩陣快速3+費馬小定理

C - M斐波那契數列 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB    

HDU 4549 M數列矩陣快速+費馬小定理

M斐波那契數列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 3476    Accepted Submi

HDU 4549 M數列矩陣快速+費馬小定理

這道題以為是很水的矩陣快速冪,把矩陣{1,1,1,0}進行快速冪乘遞推,ans[0][0]為a的指數,ans[0][1]為b的指數,但是瘋狂wa,百度搜題解發現用到了費馬小定理,A^X = A^( X mod phi(M) ) ( mod M ),又因為M為質數,所以ph

hdu 4549 M數列矩陣高速,高速降冪

else if stdlib.h article 1.0 ostream void 我們 memset font http://acm.hdu.edu.cn/showproblem.php?pid=4549 f[0] = a^1*b^0%p,f[1] = a^0*b

hdu 4549 M數列費馬小定理+矩陣快速

F(n)=a^F(n-1)*b^F(n-2)%mod 因為a和b都與mod互素,因此用費馬小定理可以得到 F(n)=a^(f(n-1)%mod-1)*b^(f(n)%mod-1) %mod

hdu-4549 M數列矩陣快速

找規律寫出f(2),f(3),f(4),f(5) .........可以發先 a b的係數是一系列的fib數列   如果可以求出fib數列 求快速冪就可以了    這樣問題就在於如何求fib數列了                           1     1 【f[n

HDU --- 4549 M數列 費馬小定理+矩陣快速

傳送門 思路: 通過把前面幾項手推出來可以發現, 其次方項符合斐波那契數列, 又因為資料非常大, 所以就可以想到用矩陣快速冪去求得次方項, 需要注意的就是我們求的是次方, 而答案是取的某個數的該次方, 而a^b % p != a^(b%p) % p, 所以就

HDU 4549 M數列 (矩陣快速 + 費馬小定理)

M斐波那契數列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 3645    Accepted Submi

HDU 4549 M數列 (費馬小定理降冪&矩陣快速)

Problem Description M斐波那契數列F[n]是一種整數數列,它的定義如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 現在給出a, b, n,你能求出F[n]的值嗎? Inpu

HDU 4549 M數列 (費馬小定理+矩陣快速)

分析: 寫出F[n]的幾項之後發現a和b的指數和斐波那契數列有關      具體的關係是      F[n]=a^fib[n-1] * b^fib[n]      矩陣快速冪求fib    快速冪求a和b的n次冪 題目要求對F[n]%mod    這

hdu 4549 M數列

f(n)表示斐波那契數列的第n項 F(n) = a^f(n-1)*b^f(n)  這個推一下就知道了 然後f(n)可以用矩陣快速冪求 1 1                         f(n+1)    f(n) 1 0  的n次冪   =   f(n)    

HDU 4549 M數列

HDU 4549 M斐波那契數列 M斐波那契數列F[n]是一種整數數列,它的定義如下: 題意:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )給

poj 3070 Fibonacci 矩陣快速 求第N個數%1000

Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11123 Accepted: 7913 Descr

HDOJ 4549 M數列 費馬小定理+矩陣快速

MF( i ) = a ^ fib( i-1 ) * b ^ fib ( i )   ( i>=3) mod 1000000007 是質數 , 根據費馬小定理  a^phi( p ) = 1

M數列 費馬小定理 + 二分快速 + 矩陣快速

M斐波那契數列F[n]是一種整數數列,它的定義如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 現在給出a, b, n,你能求出F[n]的值嗎? Input 輸入包含多組測試

[luoguP1962] 數列矩陣快速

truct ons 技術 pan opera http 快速冪 printf ble 傳送門 解析詳見julao博客連接 http://worldframe.top/2017/05/10/清單-數學方法-——-矩陣/ —&