题目1081:递推数列
2013-12-09 20:28
288 查看
题目描述:
给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。
输入:
输入包括5个整数:a0、a1、p、q、k。
输出:
第k个数a(k)对10000的模。
样例输入:
样例输出:
给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。
输入:
输入包括5个整数:a0、a1、p、q、k。
输出:
第k个数a(k)对10000的模。
样例输入:
20 1 1 14 5
样例输出:
8359
#include <iostream> #include <cstdlib> #include <cstring> using namespace std; const int MOD = 10000; /* A(k) = (p q)^(k-1) *a1 A(k-1) = (1 0) *a0 */ inline void MatrixMul( int m[][2], int n[][2] ) { int s[2][2]; memset(s,0,sizeof(s)); int i; int j; int k; for(i = 0; i < 2; i++) for(j = 0; j < 2; j++) for( k = 0; k < 2; k++) s[i][j] += m[i][k]*n[k][j]; for(i = 0; i < 2; i++) for(j = 0; j < 2; j++) m[i][j] = s[i][j]%MOD; } void MatrixN ( int m[][2], int n ) { int t[2][2]={{m[0][0],m[0][1]},{m[1][0],m[1][1]}}; if (n == 1) return; else if ( n%2 == 0) { MatrixN(m,n/2); MatrixMul(m,m); } else { MatrixN(m,n-1); MatrixMul(m,t); } } int main(void) { int a; int a0; int a1; int p; int q; int k; int m[2][2]; while (cin >> a0 >>a1 >> p >> q >> k ) { if (k == 0) a = a0; else if (k == 1) a = a1; else { m[0][0] = p%MOD; m[0][1] = q%MOD; m[1][0] = 1; m[1][1] = 0; MatrixN(m,k-1); a = m[0][0] * a1 + m[0][1] * a0; } cout<<a%MOD<<endl; } return 0; }
相关文章推荐
- 九度OJ题目1081:递推数列-快速幂
- 题目1081:递推数列
- 题目1081:递推数列
- 题目1081:递推数列
- 题目1081:递推数列
- 九度OJ 题目1081:递推数列
- 九度 oj 题目1081:递推数列
- 题目1081:递推数列 (矩阵快速幂解递推式)
- 题目1081:递推数列
- 题目1081:递推数列(矩阵二分乘法)
- 题目1081:递推数列
- 九度OJ题目1081:递推数列解题报告
- 九度OJ题目1081:递推数列-快速幂
- HDOJ题目1081 To The Max(动态规划)
- 九度OJ 1081: 递推数列
- 九度OJ 1081:递推数列 (递归,二分法)
- 九度OJ 1081:递推数列 (递归,二分法)
- OJ_1081 递推数列
- 清华大学2009年机试-递推数列-1081
- 九度oj1081递推数列的算法