[luoguP1962] 斐波那契数列(矩阵快速幂)

传送门

解析详见julao博客连接 http://worldframe.top/2017/05/10/清单-数学方法-——-矩阵/

——代码

 1 #include <cstdio>
 2 #include <cstring>
 3 #define LL long long
 4
 5 LL n;
 6 const int p = 1e9 + 7;
 7
 8 struct Matrix
 9 {
10     LL a[2][2];
11     Matrix()
12     {
13         memset(a, 0, sizeof(a));
14     }
15 };
16
17 inline Matrix operator * (const Matrix x, const Matrix y)
18 {
19     Matrix ans;
20     int i, j, k;
21     for(i = 0; i < 2; i++)
22         for(j = 0; j < 2; j++)
23             for(k = 0; k < 2; k++)
24                 ans.a[i][j] = (ans.a[i][j] + x.a[i][k] * y.a[k][j]) % p;
25     return ans;
26 }
27
28 inline int pow(LL x)
29 {
30     Matrix ans, trs;
31     ans.a[0][0] = ans.a[1][1] = 1;
32     trs.a[0][0] = trs.a[1][0] = trs.a[0][1] = 1;
33     while(x)
34     {
35         if(x & 1) ans = ans * trs;
36         trs = trs * trs;
37         x >>= 1;
38     }
39     return ans.a[0][0];
40 }
41
42 int main()
43 {
44     scanf("%lld", &n);
45     printf("%d\n", pow(n - 1));
46     return 0;
47 }

时间: 2024-10-16 08:02:32

[luoguP1962] 斐波那契数列(矩阵快速幂)的相关文章

HDU 4549 M斐波那契数列 ( 矩阵快速幂 + 费马小定理 )

HDU 4549 M斐波那契数列 (  矩阵快速幂 + 费马小定理  ) 题意:中文题,不解释 分析:最好的分析就是先推一推前几项,看看有什么规律 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef __int64 LL; #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MOD 100000

HDU 4549 M斐波那契数列(矩阵快速幂&amp;费马小定理)

ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u 题意 Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2]

UVA10299- Modular Fibonacci(斐波那契数列+矩阵快速幂)

题目链接 题意:给出n和m,求出f(n) % m, f(x)为斐波那契数列. 思路:因为n挺大的,如果直接利用公式计算很有可能会TLE,所以利用矩阵快速幂求解,|(1, 1), (1, 0)| * |f(n - 1), f(n - 2)| = |f(n), f(n - 1)|,所以求f(n)相当于|f(1), f(0)|乘上n - 1次的|(1, 1), (1, 0)|. 代码: #include <iostream> #include <cstdio> #include <

HDU4549 M斐波那契数列(矩阵快速幂+费马小定理)

Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据:每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可

hdu 4549 M斐波那契数列 矩阵快速幂+欧拉定理

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据:每组数据占一行,包含3个整数a, b,

POJ 3070 Fibonacci【斐波那契数列/矩阵快速幂】

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17171   Accepted: 11999 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequen

[P1962] 斐波那契数列 (矩阵快速幂)

题意:求出 f(n) mod 1000000007 的值,n 在long long 范围内: 解法:矩阵快速幂: 1.矩阵快速幂:  = X …………① 同理:  =  X …………② 我们把②式带入①式 得:   = X 附上代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define rg registe

斐波那契数列——矩阵的幂求解

题目: 斐波那契数列的递推公式如下: F(0) = 0; F(1) = 1; F(n + 2) = F(n + 1) + F(n); 求数列的第N项的值对10000取余的结果.( 0<=n<= 10^16) 求解斐波那契数列,如果N比较小的情况下,可以直接打表求解,但是对于N很大的情况下,并不适用. 所以,有些人会想到高精度计算,但是,N达到10^5以上时,时间复杂度难以想象,每计算一个数,需要进行高精度加法.然而还有求解对10000的取余的值. 我们可以用矩阵的幂来求解.斐波那契数列的递推公

hdu 4549 M斐波拉契 (矩阵快速幂 + 费马小定理)

Problem DescriptionM斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input输入包含多组测试数据:每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,

poj3070 (斐波那契,矩阵快速幂)

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9630   Accepted: 6839 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence