最近遇到費馬小定理的一道應用題,思考了幾個小時,理清了思路,終於證明了費馬小定理求指數餘以及矩陣冪求斐波那契結論;
先入為主(偷懶=_=),上題;
自從薈薈上了奧術課之後,她就覺得自己十分強大,但是萬惡的數學老師說我們現在來討論一下斐波那契數列。薈薈說,我知道。老師說,你知道很好,那麼我們今天我們變形一下。已知f(0)=a
f(1)=b
f(n)=f(n-1)*f(n-2) (n>=2)
求f(n)
答案mod 1000000007 (1e9+7)
多組資料輸入,每組資料第一行輸入三個整數a,b,n。0<=a,b,n<=1e16
對於每組資料輸出f(n) mod 1000000007 (1e9+7)
#include#include// a ,b , ab ,a^1b^2 ,a^2b^3
//可以發現 數列f(n)的指數存在斐波那契的變化趨勢,
//那麼直接根據對應關係求出f(n)的 指數,最後用快速冪即可;
// 其中 矩陣求求斐波那契以及費馬小定理的求餘較難,但仔細想想就可以理解;
// 1.斐波那契數列 :1,1,2,3,5,8……
// 可以由矩陣求的;
// 構造矩陣a 1 0 係數矩陣b 1 1
// 0 1 1 0
//c(0)=a*b^0 = 1 0 c(1) = a*b^1= 1 1 c(2)=a*b^2= 2 1 ……
// 0 1 1 0 1 1
// 恰好 有c(n-1).x[1][0]是 f(n)的a的指數,同時c(n-1).x[0][0]是f(n)的b的指數;
//歸納說明:由此 可根據矩陣冪來求得斐波那契數;
// 2 . 費馬小定理 的應用;
// 有公式: a^(p-1)(mod p)= 1 (p為質數); 結論:(a^(m%(p-1)) )(mod p)=a^m(mod p);
// 證明如下: m=(p-1)*k+l;
// a^m(mod p)=( a^(l)*a^(k*(p-1)) )(mod p)
//= (a^(l)(mod p)*a^(k*(p-1))(mod p) ) (mod p)
//= a^(l)(mod p)
//= a^(m%(p-1)(mod p);
// 證畢;
// 也就是說 反正對指數就可以對其mod(p-1);
// 神奇吧!
//3 還有個小問題:底數可不可以取餘呢? 可以!
// 但是要取餘p,而不是p-1;
// 道理和乘法求餘公式一樣的 :(a*b)(mod p)= (a mod p)*(b mod p )(mod p) ;
using namespace std;
typedef long long ll;
const int mod = 1000000007;
const int mod2 = 1000000006;
struct matrix
}; typedef matrix mat;
mat mul(mat a, mat b)
mat quickmul(mat a,ll n)
return ans;
}ll quickmi(ll a, ll p)
return ans;
}void print(mat a)
else
} }
矩陣快速冪求斐波那契數列
求數a aa的n nn次冪,可以採用二分法進行快速計算,即 a n a cdot a n為偶數 a cdot a cdot a n為奇數 end right.an a n a a a cdot a cdot a cdot a cdots a a cdot a cdot a cdot a 2 cdot...
矩陣快速冪(求斐波那契數列)
矩陣快速冪求斐波那契數列的模板 因為fib n 至於最近的倆個序列有關 及fib n 1 和fib n 2 所以我們儲存最近的那倆個就行了。設f n 表示乙個1 2的矩陣,f n fib n fib n 1 可以看成 a,b a b,b 所以可以變成f n f n 1 a a表示乙個二維矩陣 a 2...
斐波那契(矩陣快速冪)
斐波那契數列,即fib n fib n 1 fib n 2 fib n fib n 1 fib n 2 fib n fib n 1 fi b n 2 就這麼乙個數列,顯然可以直接遞推求解,時間複雜度o n o n o n 似乎沒什麼問題。然後就遇到了這個,n nn的取值範圍最大是2 1 09 2 t...