标签:
题目:给你Fib数列的前两项,求第n项的后m位的值。
分析:矩阵快速模幂。见本博客的:斐波那契数列
说明:╮(╯▽╰)╭。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; class matrix { private: int data[2][2]; public: matrix(){}; matrix(int a, int b, int c, int d){ data[0][0] = a;data[0][1] = b; data[1][0] = c;data[1][1] = d; } matrix(int a, int b, int mod); friend matrix mul(matrix A, matrix B, int mod); friend matrix qpow(matrix mat, int n, int mod); int operator ()(int x, int y){return data[x-1][y-1];} }; //矩阵乘法 matrix mul(matrix A, matrix B, int mod) { matrix C; for (int i = 0 ; i < 2 ; ++ i) for (int j = 0 ; j < 2 ; ++ j) { C.data[i][j] = 0; for (int k = 0 ; k < 2 ; ++ k) C.data[i][j] = (C.data[i][j]+A.data[i][k]*B.data[k][j])%mod; } return C; } //矩阵快速幂 matrix qpow(matrix mat, int n, int mod) { if (n == 1) return mat; matrix now = qpow(mat, n/2, mod); if (n%2 == 0) return mul(now, now, mod); return mul(mul(now, now, mod), mat, mod); } int mod[5] = {1, 10, 100, 1000, 10000}; int main() { int t,a,b,n,m; while (cin >> t) while (t --) { cin >> a >> b >> n >> m; if (n == 0) cout << a%mod[m] << endl; else if (n == 1) cout << b%mod[m] << endl; else if (n == 2) cout << (a+b)%mod[m] << endl; else { matrix A(a, b, b, a+b); matrix B = qpow(matrix(0, 1, 1, 1), n-2, mod[m]); cout << mul(A, B, mod[m])(2,2) << endl; } } return 0; }
UVa 10689 - Yet another Number Sequence
标签:
原文地址:http://blog.csdn.net/mobius_strip/article/details/45647965