[51NOD]1126 求递推序列的第N项 [线性递推关系与矩阵乘法]
2017-03-17 23:45
771 查看
题目链接
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
给出A,B和N,求f(n)的值。
Output
输出f(n)的值。
至于该代码的解释,看这篇文章
有一个序列是这样定义的: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 5Output示例
6题解
利用线性递推关系与矩阵乘法就能AC了,复杂度o(k3logn) ,可以再优化掉一个k ,但对于这个题是没必要的至于该代码的解释,看这篇文章
#include<stdio.h> #include<string.h> #include<queue> #include<vector> #define INF 0x3f3f3f3f #define MAX_N 3 #define MOD 7 using namespace std; typedef long long LL; int N;LL b_n=0,C[MAX_N],h[MAX_N]; struct matrix{LL m[MAX_N][MAX_N];}; matrix multi(matrix a,matrix b){ matrix tmp; for(int i=1;i<=N;i++) for(int j=1;j<=N;j++){ tmp.m[i][j]=0; for(int k=1;k<=N;k++) tmp.m[i][j]+=a.m[i][k]*b.m[k][j]; tmp.m[i][j]%=MOD; } return tmp; } matrix fast_mod(matrix a,int n){ matrix res; for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) res.m[i][j]=(i==j); while(n){ if(n&1) res=multi(res,a); a=multi(a,a); n>>=1; } return res; } void init(matrix &res,matrix &H){ for(int i=1;i<=N;i++) res.m[1][i]=C[i]; res.m[1] =b_n; for(int i=2;i<=N;i++) for(int j=1;j<=N;j++) res.m[i][j]=(i==j+1); res.m [N-1]=0;res.m =1; for(int i=1;i<=N;i++){ H.m[i][1]=h[N-i]; for(int j=2;j<=N;j++) H.m[i][j]=0; } H.m [1]=1; } void slove(int k,int n){ matrix res,H; init(res,H); res=fast_mod(res,n-k); res=multi(res,H); LL ans=res.m[1][1]; printf("%lld\n",(MOD+ans)%MOD); } int main() { int n; while(scanf("%lld%lld%d",&C[1],&C[2],&n)!=EOF){ h[1]=h[2]=1; N=3; slove(2,n); } return 0; }
相关文章推荐
- 51nod 1126 求递推序列的第N项【矩阵快速幂】
- 【51nod 1126】求递推序列的第N项 【矩阵快速幂】or【枚举找循环节】
- 51nod 1126 求递推序列的第N项(矩阵快速幂、循环)
- 51nod 1126 求递推序列的第N项 (矩阵快速幂)
- 51Nod 1126 求递推序列的第N项 矩阵快速幂
- 51nod 1126 求递推序列的第N项 矩阵快速幂
- 51nod 1126 求递推序列的第N项(矩阵快速幂)
- 51nod-【1126 求递推序列的第N项】
- 51nod 1126 求递推序列的第N项
- 51 nod 1126 求递推序列的第N项(矩阵快速幂)
- 51NOD 1126求递推序列的第N项 模拟找循环节
- 51Nod 1126 求递推序列的第N项
- 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释
- 【51nod】--1126 求递推序列的第N项 (数论&&模拟)
- 51Nod Problem 1126 求递推序列的第N项(构造矩阵)
- 51nod 1126 求递推序列的第N项
- 51nod 1126 求递推序列的第N项
- HDU-1005 Number Sequence && 51NOD-1126 求递推序列的第N项
- C - 求递推序列的第N项 51Nod - 1126【数学】
- 51nod--1126 求递推序列的第N项