HLG-1126(矩阵乘法+快速幂)
2014-10-20 19:44
155 查看
Final Destination II
Time Limit: 1000 MS Memory Limit: 65536 K
Description
JiaoZhu likes going on adventure! One day, he walks into a big castle, and there is an unique stairway. JiaoZhu finds a board ,it says “The one who want to go upstairs only can go three steps the most once, meaning that you can go 1 or 2 or 3 steps once!”.
Now, we have a problem, can you tell me the number of ways to go to the destination? If you can’t ,death is the only choice。
In the beginning, you are in the 0th step.
Input
First input a integer T(T<50), represent the number of case.
Each case ,the input will consist only a positive integer n (0<=n<=1000000000), represent the nth steps you want to go to..
Output
Order the sample output format to output.
Line 1,print the Case k.
Line 2,print one integer represent the number of ways to go to nth steps.(MOD 1000000007)
Sample Input
2
1
2
Sample Output
Case 1:
1
Case 2:
2
Hint
When n=2,you can go one step once to go to 2th ,or go 2 steps once to 2th,so the answer is 2.
题意:可以走1步或2步或3步,求走到距离n步可以有多少走法。
思路:通过矩阵相乘来递推优化,根据之前的状态递推后面的状态。如该题当前n步数等于到n-1步、n-2步、n-3步之和。
构造矩阵:
1 1 1 a(n-1) 0 0
1 0 0 X a(n-2) 0 0
0 1 0 a(n-3) 0 0
每次相乘都将每位置状态向后移一次。
Time Limit: 1000 MS Memory Limit: 65536 K
Description
JiaoZhu likes going on adventure! One day, he walks into a big castle, and there is an unique stairway. JiaoZhu finds a board ,it says “The one who want to go upstairs only can go three steps the most once, meaning that you can go 1 or 2 or 3 steps once!”.
Now, we have a problem, can you tell me the number of ways to go to the destination? If you can’t ,death is the only choice。
In the beginning, you are in the 0th step.
Input
First input a integer T(T<50), represent the number of case.
Each case ,the input will consist only a positive integer n (0<=n<=1000000000), represent the nth steps you want to go to..
Output
Order the sample output format to output.
Line 1,print the Case k.
Line 2,print one integer represent the number of ways to go to nth steps.(MOD 1000000007)
Sample Input
2
1
2
Sample Output
Case 1:
1
Case 2:
2
Hint
When n=2,you can go one step once to go to 2th ,or go 2 steps once to 2th,so the answer is 2.
题意:可以走1步或2步或3步,求走到距离n步可以有多少走法。
思路:通过矩阵相乘来递推优化,根据之前的状态递推后面的状态。如该题当前n步数等于到n-1步、n-2步、n-3步之和。
构造矩阵:
1 1 1 a(n-1) 0 0
1 0 0 X a(n-2) 0 0
0 1 0 a(n-3) 0 0
每次相乘都将每位置状态向后移一次。
#include<stdio.h> #include<string.h> #define mod 1000000007 long long stairs[3][3]; void multy(long long a[][3],long long b[][3])//矩阵的乘法 { long long i, j, k; long long c[3][3]; for(i = 0; i < 3; i++) for(j = 0; j < 3; j++){ c[i][j] = 0; for(k = 0; k < 3; k++){ c[i][j] += ((a[i][k]%mod)*(b[k][j]%mod))%mod; } } for(i = 0; i < 3; i++)//将结果返回给b[][]; for(j = 0; j < 3; j++) b[i][j] = c[i][j]%mod; } long long ultim(long long n,long long a[][3],long long b[][3]) { while(n)//矩阵的快速幂求法 { if(n&1) multy(a,b); multy(a,a); n/=2; } return b[0][0]; } int main() { long long n,k=1,t; scanf("%lld",&t); while(t--) { scanf("%lld",&n); memset(stairs,0,sizeof(stairs)); stairs[0][0]=4;stairs[1][0]=2;stairs[2][0]=1; long long coeff[3][3]={1,1,1,1,0,0,0,1,0}; //multy(coeff,coeff); printf("Case %lld:\n",k++); if(n==0) printf("1\n"); else if(n == 1) printf("1\n"); else if(n == 2) printf("2\n"); else printf("%lld\n",ultim(n-3,coeff,stairs)); } return 0; }
相关文章推荐
- HLG 1126 Final Destination II(快速幂,矩阵乘法)
- HLG-1375(矩阵乘法+快速幂)
- HLG 1126 Final Destination II 矩阵乘法+快速求幂
- [WIKIOI 1250]Fibonacci数列(数论+数学+矩阵乘法+二分快速幂)
- ZCMU-1618-骨牌覆盖(矩阵乘法+快速幂)
- [51NOD]1126 求递推序列的第N项 [线性递推关系与矩阵乘法]
- HLG 1126 Final Destination II (转化为矩阵)(水题)
- 快速求斐波那契数列(矩阵乘法+快速幂)
- 数列(矩阵乘法+快速幂)
- 【HDOJ5950】Recursive sequence(矩阵乘法,快速幂)
- 快速乘法&快速幂&矩阵快速幂简单讲解
- Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)
- 【poj3070】Fibonacci (矩阵乘法+快速幂)
- Luogu T7152 细胞(递推,矩阵乘法,快速幂)
- luogu3390:矩阵快速幂(矩阵乘法+快速幂)
- UVA 10229 Modular Fibonacci (矩阵乘法+快速幂)
- 矩阵乘法及矩阵快速幂运算
- 矩阵(加法&&乘法&&快速幂)
- poj 3613Cow Relays (矩阵乘法 快速幂)
- ACM学习历程—HDU5667 Sequence(数论 && 矩阵乘法 && 快速幂)