洛谷—— P1962 斐波那契数列

https://www.luogu.org/problem/show?pid=1962

题目背景

大家都知道,斐波那契数列是满足如下性质的一个数列:

• f(1) = 1

• f(2) = 1

• f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数)

题目描述

请你求出 f(n) mod 1000000007 的值。

输入输出格式

输入格式:

·第 1 行:一个整数 n

输出格式:

第 1 行: f(n) mod 1000000007 的值

输入输出样例

输入样例#1:

5

输出样例#1:

5

输入样例#2:

10

输出样例#2:

55

说明

对于 60% 的数据: n ≤ 92

对于 100% 的数据: n在long long(INT64)范围内。

矩阵乘法优化。、

 1 #include <cstdio>
 2
 3 #define LL long long
 4 const LL mod(1000000007);
 5
 6 inline void read(LL &x)
 7 {
 8     x=0; register char ch=getchar();
 9     for(; ch>‘9‘||ch<‘0‘; ) ch=getchar();
10     for(; ch>=‘0‘&&ch<=‘9‘; ch=getchar()) x=x*10+ch-‘0‘;
11 }
12
13 LL n,m;
14 struct Matrix_fb {
15     LL e[2][2];
16     void init_base()
17     {
18         e[0][0]=1;
19         e[0][1]=1;
20         e[1][0]=1;
21         e[1][1]=0;
22     }
23     void init_ans()
24     {
25         e[0][0]=e[0][1]=1;
26     }
27     Matrix_fb operator * (Matrix_fb x) const
28     {
29         Matrix_fb tmp;
30         for(int i=0; i<2; ++i)
31             for(int j=0; j<2; ++j)
32             {
33                 tmp.e[i][j]=0;
34                 for(int k=0; k<2; ++k)
35                     tmp.e[i][j]+=e[i][k]*x.e[k][j],tmp.e[i][j]%=mod;
36             }
37         return tmp;
38     }
39 }ans,base;
40
41 int AC()
42 {
43 //    freopen("spfa.in","r",stdin);
44 //    freopen("spfa.out","w",stdout);
45     read(n);
46     if(n==1||n==2) { puts("1"); return 0; }
47     ans.init_ans(); base.init_base();
48     for( n-=2; n; n>>=1,base=base*base)
49         if(n&1) ans=ans*base;
50     printf("%lld\n",ans.e[0][0]);
51     return 0;
52 }
53
54 int Aptal=AC();
55 int main(){;}

单位矩阵 在第一行

 1 #include <cstdio>
 2
 3 #define LL long long
 4 const LL mod(1000000007);
 5
 6 inline void read(LL &x)
 7 {
 8     x=0; register char ch=getchar();
 9     for(; ch>‘9‘||ch<‘0‘; ) ch=getchar();
10     for(; ch>=‘0‘&&ch<=‘9‘; ch=getchar()) x=x*10+ch-‘0‘;
11 }
12
13 LL n,m;
14 struct Matrix_fb {
15     LL e[2][2];
16     void init_base()
17     {
18         e[0][0]=1;
19         e[0][1]=1;
20         e[1][0]=1;
21         e[1][1]=0;
22     }
23     void init_ans()
24     {
25         e[0][0]=e[1][1]=1;
26     }
27     Matrix_fb operator * (Matrix_fb x) const
28     {
29         Matrix_fb tmp;
30         for(int i=0; i<2; ++i)
31             for(int j=0; j<2; ++j)
32             {
33                 tmp.e[i][j]=0;
34                 for(int k=0; k<2; ++k)
35                     tmp.e[i][j]+=e[i][k]*x.e[k][j],tmp.e[i][j]%=mod;
36             }
37         return tmp;
38     }
39 }ans,base;
40
41 LL GCD(LL a,LL b)
42 {
43     return !b ? a : GCD(b,a%b);
44 }
45
46 int AC()
47 {
48 //    freopen("spfa.in","r",stdin);
49 //    freopen("spfa.out","w",stdout);gcd-=2
50     read(n);
51     if(n==1||n==2) { puts("1"); return 0; }
52     ans.init_ans(); base.init_base();
53     for( ; n; n>>=1,base=base*base)
54         if(n&1) ans=ans*base;
55     printf("%lld\n",ans.e[0][1]);
56     return 0;
57 }
58
59 int Aptal=AC();
60 int main(){;}

单位矩阵,在对角线

时间: 2024-08-13 16:33:56

洛谷—— P1962 斐波那契数列的相关文章

洛谷P1962 斐波那契数列

P1962 斐波那契数列 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请你求出 f(n) mod 1000000007 的值. 输入输出格式 输入格式: ·第 1 行:一个整数 n 输出格式: 第 1 行: f(n) mod 1000000007 的值 输入输出样例 输入样例#1: 5 输出样例#1: 5 输入样例#2: 10 输出样例#2:

洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请你求出 f(n) mod 1000000007 的值. 输入输出格式 输入格式: ·第 1 行:一个整数 n 输出格式: 第 1 行: f(n) mod 1000000007 的值 输入输出样例 输入样例#1: 5 输出样例#1: 5 输入样例#2: 10 输出样例#2: 55 说明

洛谷 P2626 斐波那契数列(升级版)

题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数). 题目描述 请你求出第n个斐波那契数列的数mod(或%)2^31之后的值.并把它分解质因数. 输入输出格式 输入格式: n 输出格式: 把第n个斐波那契数列的数分解质因数. 输入输出样例 输入样例#1: 5 输出样例#1: 5=5 输入样例#2: 6 输出样例#2: 8=2*2*2 说明 n<=48 质因数分解

洛谷——P2626 斐波那契数列(升级版)矩阵

题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数). 题目描述 请你求出第n个斐波那契数列的数mod(或%)2^31之后的值.并把它分解质因数. 输入输出格式 输入格式: n 输出格式: 把第n个斐波那契数列的数分解质因数. 输入输出样例 输入样例#1: 复制 5 输出样例#1: 复制 5=5 输入样例#2: 复制 6 输出样例#2: 复制 8=2*2*2 说明

[洛谷1962]斐波那契数列

思路: 常见算法时矩阵快速幂,但事实上这题可以不需要矩阵快速幂. 设斐波那契数列为$f$,观察规律可以发现: 当$n$为偶数时,$f_n=(f_{n-1}\times 2+f_n)\times f_n$: 当$m$为奇数时,$f_n=f_{n+1}^2+f_n^2$. 这样只要用一个map记录已经计算过的Fibonacci数,递归求得答案即可. 再用一个hash_map跑得和标算一样快(0ms),而且内存更小. 1 #include<cstdio> 2 #include<ext/hash

luogu P1962 斐波那契数列

二次联通门 : luogu P1962 斐波那契数列 /* luogu P1962 斐波那契数列 矩阵快速幂求feibonacii 矩阵为 1 1 1 0 做N - 2次方就好 */ #include <cstdio> #define Mod 1000000007 #define Max 2 void read (long long &now) { now = 0; register char word = getchar (); while (word < '0' || wor

P1962 斐波那契数列 【矩阵快速幂】

一.题目 P1962 斐波那契数列 二.分析 比较基础的递推式转换为矩阵递推,这里因为$n$会超出$int$类型,所以需要用矩阵快速幂加快递推. 三.AC代码 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 #define ll long long 5 #define Min(a,b) ((a)>(b)?(b):(a)) 6 #define Max(a,b) ((a)>(b)?(a):(b)) 7 const ll mod

洛谷P1306 斐波那契公约数

P1306 斐波那契公约数 题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少? 输入输出格式 输入格式: 两个正整数n和m.(n,m<=10^9) 注意:数据很大 输出格式: Fn和Fm的最大公约数. 由于看了大数字就头晕,所以只要输出最后的8位数字就可以了. 输入输出样例 输入样例#1: 4 7 输出样例#1: 1 说明 用递归&递推会超时 用通项公式也会超时 /* 首先,斐波

P1962 斐波那契数列

传送门 斐波那契数列 看一眼果断递推 f[ i ] = f[ i-1 ] + f[ i-2 ] 嘛 数据一看.. 好像不行.... 那就矩阵优化一下嘛 最基础的矩阵乘法嘛 (不懂先学一下 矩阵乘法 吧) 稍微想一想: 设矩阵为 A 那么矩阵 [  f[i-2]   ,   f[i-1]  ] * A 要等于 [  f[i-1]   ,   f[i]  ](即要等于 [ f[i-1]   ,   f[i-1]+f[i-2]  ]) 在纸上稍微画一下就得到 A 了 (随便挂一下当初学构造矩阵的链接: