矩阵乘法快速幂 codevs 1574 广义斐波那契数列

codevs 1574 广义斐波那契数列

时间限制: 1 s

空间限制: 256000 KB

题目等级 : 钻石 Diamond

题目描述 Description

广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列。今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数。

输入描述 Input Description

输入包含一行6个整数。依次是p,q,a1,a2,n,m,其中在p,q,a1,a2整数范围内,n和m在长整数范围内。

输出描述 Output Description

输出包含一行一个整数,即an除以m的余数。

样例输入 Sample Input

1 1 1 1 10 7

样例输出 Sample Output

6

数据范围及提示 Data Size & Hint

数列第10项是55,除以7的余数为6。

 1 /*
 2 注意:矩阵快速幂是把构造的矩阵乘^n次(根据同余原理,计算中是可以%的)后,再与原矩阵想乘,把原矩阵做n次快速幂是错误的*/
 3 /*
 4 联系一下int的快速幂:
 5 ans=1;
 6 while(n)//求b^n
 7 {
 8      if(n&1)
 9       ans=ans*b;-------1
10     n>>=1;
11     b=b*b;---------2
12 }
13 就是把1,2两句中的相乘都用“三变量法”来做(矩阵的特殊性,不能把结果直接存进原矩阵中)。
14 */
 1 #include<iostream>
 2 using namespace std;
 3 #include<cstdio>
 4 typedef long long ll;
 5 ll n,m;
 6 ll p,q,a1,a2;
 7 ll jz[3][3],b[3][3],c[3][3];/*注意以后遇到ll与int相乘的题目,把int的变量直接设为ll*/
 8 int main()
 9 {
10     cin>>p>>q>>a1>>a2;
11     cin>>n>>m;n-=2;
12     b[1][1]=jz[1][1]=0;b[1][2]=jz[1][2]=q;
13     b[2][1]=jz[2][1]=1;b[2][2]=jz[2][2]=p;
14
15     while(n)
16     {
17         if(n&1)
18         {
19             for(int i=1;i<=2;++i)
20               for(int j=1;j<=2;++j)
21                 for(int k=1;k<=2;++k)
22                 c[i][j]=(c[i][j]+jz[i][k]*b[k][j]%m)%m;
23             for(int i=1;i<=2;++i)
24               for(int j=1;j<=2;++j)
25               jz[i][j]=c[i][j],c[i][j]=0;
26         }
27         n>>=1;
28         for(int i=1;i<=2;++i)
29           for(int j=1;j<=2;++j)
30             for(int k=1;k<=2;++k)
31             c[i][j]=(c[i][j]+b[i][k]*b[k][j]%m)%m;
32         for(int i=1;i<=2;++i)
33           for(int j=1;j<=2;++j)
34           b[i][j]=c[i][j],c[i][j]=0;
35     }
36
37
38     cout<<(a2*jz[2][1]%m+a1*jz[1][1]%m)%m;/*注意这里要把a1,a2乘以原来的那个01向量,而不是pq向量,因为矩阵计算了n-2次,如果乘以pq向量的话,计算出的是an+1*/
39     return 0;
40 }
时间: 2024-08-03 11:27:48

矩阵乘法快速幂 codevs 1574 广义斐波那契数列的相关文章

(矩阵快速幂)51NOD 1242斐波那契数列的第N项

斐波那契数列的定义如下: 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的结果即可. 输入 输入1个数n(1 <= n <= 10^18). 输出 输出F(n) % 1000000009的结果. 输入样例 11 输出样例 89解:由于斐波那

矩阵快速幂 [HDU 4549] M斐波那契数列

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1609    Accepted Submission(s): 460 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a,

【费马小定理+矩阵快速幂】HDU4549——M斐波那契数列

[题目大意] M斐波那契数列F[n]是一种整数数列,它的定义如下:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )现在给出a, b, n,求出F[n]的值. [思路] 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 typedef long

[快速幂][UVa11582]巨大的斐波那契数列!

题目大意 输入a, b, n, 计算f( a ^ b) % n  , f( i ) = f( i - 1) + f( i - 2 ) , f( 0 ) = f(1) = 1, 其中,0 <= a , b <= 2 ^ 64,  0 <= n <= 1000 思考 首先扔出两个结论(证明过程链接在此,个人水平有限看不懂.) 1.斐波那契数列模n 必有循环节. 2.斐波那契数列模n 的情况下,最多n^2项就会出现重复. 先找出循环节M,之后计算a^b%M 是多少,输出fib[a^b%M

洛谷1349 广义斐波那契数列 【矩阵乘法】

洛谷1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数. 输入输出格式 输入格式: 输入包含一行6个整数.依次是p,q,a1,a2,n,m,其中在p,q,a1,a2整数范围内,n和m在长整数范围内. 输出格式: 输出包含一行一个整数,即an除以m的余数. 输入输出样例 输入样例#1: 1 1 1 1 10 7 输出样例#1: 6 说明

洛谷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 说明

P1349 广义斐波那契数列(矩阵乘法)

题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatrix} p&q\1&0\\end{bmatrix}^{n-2}=\begin{bmatrix}f_n\\f_{n-1} \end{bmatrix}\] 水题 代码 #include <bits/stdc++.h> #define int long long using namesp

HDU 5451 广义斐波那契数列

这道题目可以先转化: 令f(1) = 5+2√6 f(2) = f(1)*(5+2√6) ... f(n) = f(n-1)*(5+2√6) f(n) = f(n-1)*(10-(5-2√6)) = 10*f(n-1)-(5-2√6)f(n-1) = 10*f(n-1) - 10/(5+2√6) f(n-1) = 10*f(n-1) - 10/(5+2√6) * (5+2√6)f(n-2) = 10*f(n-1) - f(n-2) 那么就可以写成矩阵相乘的形式了 (f(n) , f(n-1))

P1349 广义斐波那契数列

题目描述 广义的斐波那契数列是指形如an=p×an−1+q×an−2an=p\times a_{n-1}+q\times a_{n-2}an=p×an−1?+q×an−2?的数列.今给定数列的两系数ppp和qqq,以及数列的最前两项a1a_1a1?和a2a_2a2?,另给出两个整数nnn和mmm,试求数列的第nnn项ana_nan?除以mmm的余数. 输入格式 输入包含一行6个整数.依次是p,q,a1?,a2?,n,m,其中在p,q,a1?,a2?整数范围内,n和m在长整数范围内. 输出格式 输