51nod 1242 矩阵快速幂

斐波那契数列的定义如下:

F(0) = 0

F(1) = 1

F(n) = F(n - 1) + F(n - 2) (n >= 2)

(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...)

给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可。

Input

输入1个数n(1 <= n <= 10^18)。

Output

输出F(n) % 1000000009的结果。

Input示例

11

Output示例

89

所以求出A^n就可以求出f(n)了。



 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <vector>
 5 #define ll long long
 6 using namespace std;
 7 typedef vector<ll> vec;
 8 typedef vector<vec> mat;
 9 const ll Mod = 1000000009;
10
11 mat mul(mat &A, mat &B) {
12     mat C(A.size(), vec(B[0].size()));
13     for(int i = 0; i < A.size(); i ++) {
14         for(int k = 0; k < B.size(); k ++) {
15             for(int j = 0; j < B[0].size(); j ++) {
16                 C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % Mod;
17             }
18         }
19     }
20     return C;
21 }
22 mat pow(mat A, ll n) {
23     mat B(A.size(), vec(A.size()));
24     for(int i = 0; i < A.size(); i ++) {
25         B[i][i] = 1;
26     }
27     while(n > 0) {
28         if(n&1) B = mul(B,A);
29         A = mul(A,A);
30         n >>= 1;
31     }
32     return B;
33 }
34 int main() {
35     ll n;
36     cin >> n;
37     mat A(2, vec(2));
38     A[0][0] = 1; A[0][1] = 1;
39     A[1][0] = 1; A[1][1] = 0;
40     A = pow(A, n);
41     printf("%lld\n",A[1][0]);
42     return 0;
43 }
时间: 2024-11-03 22:07:56

51nod 1242 矩阵快速幂的相关文章

51Nod - 1113 矩阵快速幂

51Nod - 1113 矩阵快速幂 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大,只需要输出每个元素Mod (10^9 + 7)的结果. Input 第1行:2个数N和M,中间用空格分隔.N为矩阵的大小,M为M次方.(2 <= N <= 100, 1 <= M <= 10^9) 第2 - N + 1行:每行N个数,对应N * N矩阵中的1行.(0 <= N[i] <= 10^9) Output 共N行,每行N个数,对应M

51nod 1537 分解(矩阵快速幂)

分析:先写出前几项,发现都是有解的.记(1+√2)^n=a+b√2,可以归纳证明,当n为奇数时,m=a^2+1,n为偶数时,m=a^2.写出a的递推式,用矩阵快速幂算一下a即可. 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 const int p=1e9+7; 6 typedef unsigned long long ull; 7 ull mat

51nod 算法马拉松18 B 非010串 矩阵快速幂

非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) Input 一个数n,表示长度.(n<1e15) Output 长度为n的非010串的个数.(对1e9+7取模) Input示例 3 Output示例 7 解释: 000 001 011 100 101 110 111 读完题,这样的题目肯定是能找到规律所在的,要不然数据太大根本无法算.假设现在给的

【51Nod 1341】混合序列 矩阵快速幂

题意 给定两个数列\(a_n=pa_{n-1}+r,a_0=0\) , \(b_n=qb_{n-1},b_0=3\) , 求\(\sum_{i=0}^{n}a_i\times b_{n-i} \mod {1e9+7}\) 如果\(n\)的范围是\(1e7\),可以用FFT加速卷积 这题范围过大,所以只能用别的方法 令\(f_n=\sum_{i=0}^{n}a_i\times b_{n-i}\) , 那么\(f_{n+1}=\sum_{i=0}^{n+1}a_i\times b_{n+1-i}=\

51nod1113(矩阵快速幂模板)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113 题意:中文题诶- 思路:矩阵快速幂模板 代码: 1 #include <iostream> 2 #define ll long long 3 using namespace std; 4 5 const int mod = 1e9+7; 6 const int MAXN = 1e2+10; 7 int n, m; 8 9 typedef struct

矩阵快速幂总结

基础:快速幂,矩阵乘法: 快速幂: #include<cstdio> #include<cstring> #define ll long long ll poww(ll a,ll b) { ll ans=1; while(b) { if(b&1) ans*=a; b>>=1;a*=a; } return ans; } int main() { ll a,b; scanf("%lld %lld",&a,&b); ll ans=p

矩阵快速幂刷题系列

来源自http://blog.csdn.net/chenguolinblog/article/details/10309423 hdu 1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5587    Accepted Submission(s): 4200 Problem Description A为一个方阵,则Tr

HDU 1757 A Simple Math Problem (矩阵快速幂)

[题目链接]:click here~~ [题目大意]: If x < 10 f(x) = x. If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 * f(x-10); 问f(k)%m的值. [思路]:矩阵快速幂,具体思路看代码吧,注意一些细节. 代码: #include<bits/stdc++.h> using namespace std; typedef long long LL; const

Codeforces Round #291 (Div. 2) E - Darth Vader and Tree (DP+矩阵快速幂)

这题想了好长时间,果断没思路..于是搜了一下题解.一看题解上的"快速幂"这俩字,不对..这仨字..犹如醍醐灌顶啊...因为x的范围是10^9,所以当时想的时候果断把dp递推这一方法抛弃了.我怎么就没想到矩阵快速幂呢.......还是太弱了..sad..100*100*100*log(10^9)的复杂度刚刚好. 于是,想到了矩阵快速幂后,一切就变得简单了.就可以把距离<=x的所有距离的点数都通过DP推出来,然后一个快速幂就解决了. 首先DP递推式很容易想到.递推代码如下: for(