标签:等于 mod class 快速 inpu icon lock text tle
输入1个数n(1 <= n <= 10^18)。
输出F(n) % 1000000009的结果。
11
89
解:由于斐波那契数列的第N(N>2)项等于N-1个{{1,1},{1,1}}矩阵相乘后的第一项。
由于这种矩阵形式上的特殊性(对称,乘法可交换),我们可以借助快速幂的思想可以快速求解这个答案。
1 #include <stdio.h> 2 3 #define MOD 1000000009 4 5 int main() 6 { 7 long long n; 8 while (scanf_s("%lld", &n) != EOF) 9 { 10 long long a[2][2] = { 1,0,0,1 }, tmp[2][2] = { 1,1,1,0 }; 11 if (n < 2)printf("%d\n", n); 12 else 13 { 14 --n; 15 while (n) 16 { 17 if (n % 2) 18 { 19 int q, w, e; 20 q = (tmp[0][0] * a[0][0] + tmp[0][1] * a[1][0]) % MOD; 21 w = (tmp[0][0] * a[0][1] + tmp[0][1] * a[1][1]) % MOD; 22 e = (tmp[1][0] * a[0][1] + tmp[1][1] * a[1][1]) % MOD; 23 a[0][0] = q; 24 a[0][1] = a[1][0] = w; 25 a[1][1] = e; 26 } 27 int q, w, e; 28 q = (tmp[0][0] * tmp[0][0] + tmp[0][1] * tmp[1][0]) % MOD; 29 w = (tmp[0][0] * tmp[0][1] + tmp[0][1] * tmp[1][1]) % MOD; 30 e = (tmp[1][0] * tmp[0][1] + tmp[1][1] * tmp[1][1]) % MOD; 31 tmp[0][0] = q; 32 tmp[0][1] = tmp[1][0] = w; 33 tmp[1][1] = e; 34 n >>= 1; 35 } 36 printf("%d\n", a[0][0]); 37 } 38 } 39 }
标签:等于 mod class 快速 inpu icon lock text tle
原文地址:https://www.cnblogs.com/Ekalos-blog/p/10017725.html