51 nod 1126 求递推序列的第N项(矩阵快速幂)
2016-07-31 12:23
239 查看
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
给出A,B和N,求f(n)的值。
Input
输入3个数:A,B,N。数字之间用空格分割。(-10000 <= A, B <= 10000, 1 <= N <= 10^9)
Output
输出f(n)的值。
Input示例
3 -1 5
Output示例
6
思路:
构造两个二维矩阵,求递推。看代码
给出A,B和N,求f(n)的值。
Input
输入3个数:A,B,N。数字之间用空格分割。(-10000 <= A, B <= 10000, 1 <= N <= 10^9)
Output
输出f(n)的值。
Input示例
3 -1 5
Output示例
6
思路:
构造两个二维矩阵,求递推。看代码
#include<iostream> #include<cstdio> #include<map> #include<set> #include<vector> #include<queue> #include<stack> #include<cmath> #include<algorithm> #include<cstring> #include<string> using namespace std; #define INF 0x3f3f3f3f #define mod 7 typedef long long LL; typedef vector<LL> vec; typedef vector<vec> mat; // A*B mat mul(mat& A, mat& B) { mat C(A.size(), vec(B[0].size())); for(int i = 0; i < (int)A.size(); ++i) for(int j = 0; j < (int)B[0].size(); ++j) for(int k = 0; k < (int)B.size(); ++k) C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % mod; return C; } // A^n mat pow(mat A, int n) { mat B(A.size(), vec(A.size())); for(int i = 0; i < (int)A.size(); ++i) B[i][i] = 1; while(n) { if(n & 1) B = mul(B, A); A = mul(A, A); n >>= 1; } return B; } int main() { LL a,b; int n; mat A(2,vec(2)); mat B(2,vec(2)); cin>>a>>b>>n; if(n==1||n==2)cout<<1<<endl; else { A[0][0]=a;//构造的两个矩阵 A[0][1]=b; A[1][0]=1; A[1][1]=0; B[0][0]=1; B[0][1]=0; B[1][0]=1; B[1][1]=0; A=pow(A,n-2); A=mul(A,B); cout<<(A[0][0]+mod)%mod<<endl;//因为有负数的情况,所以要处理下!!!! } return 0; }
相关文章推荐
- 51 nod 1126 求递推序列的第N项 矩阵快速幂
- 51nod 1126 求递推序列的第N项(矩阵快速幂、循环)
- 51Nod 1126 求递推序列的第N项 矩阵快速幂
- 1126 求递推序列的第N项(51nod)
- [51NOD1126]求递推序列的第n项(矩阵快速幂)
- 51nod 1126 求递推序列的第N项【矩阵快速幂】
- 51nod 1126 求递推序列的第N项 (矩阵快速幂)
- 【51nod 1126】求递推序列的第N项 【矩阵快速幂】or【枚举找循环节】
- 51nod 1126 求递推序列的第N项 矩阵快速幂
- 51nod 1126 求递推序列的第N项(矩阵快速幂)
- 51Nod Problem 1126 求递推序列的第N项(构造矩阵)
- 51nod 求递推序列的第N项(矩阵快速幂、模拟求循环长度)
- 51 nod 1242 斐波那契数列的第N项 矩阵快速幂
- [51NOD]1126 求递推序列的第N项 [线性递推关系与矩阵乘法]
- 51nod 1126 求递推序列的第N项(循环节)
- C - 求递推序列的第N项 51Nod - 1126【数学】
- 51Nod-1126-求递推序列的第N项
- 【51nod】--1126 求递推序列的第N项 (数论&&模拟)
- 51nod 1126 求递推序列的第N项 && hdu - 1005 Number Sequence (求周期)
- 【51Nod】1126 - 求递推数列的第N项(矩阵快速幂 & C++运算符重载)