有一个序列是这样定义的: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
首先说矩阵乘法,正方形矩阵,行数、列数都为N,a[i][j] = (k 1->N) a[i][k]* a[k][j] 。
f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7
2*2 矩阵X: A B 乘 矩阵Y f(2) 0 等于 f(3) 0
1 0 f(1) 0 f(2) 0
可得 X^(N-2) * Y = f(n) 0 注意 X, Y 为矩阵
f(n-1) 0
在计算 X^(N-2) 是要用到矩阵快速幂,矩阵快速幂和 快速幂 的思路差不多, 只不多将两个数的乘法换成矩阵乘法。
注意:这道题有一个隐藏的坑点,就是序列中的数需要大于等于 0
#include <iostream> #include <cstring> using namespace std; const int N = 2; const int mod = 7; typedef struct matrix{ int a[N][N]; }Matrix; Matrix multi(Matrix A, Matrix B) { Matrix temp; memset(temp.a, 0, sizeof(temp.a)); for(int i=0; i<N; i++) for(int j=0; j<N; j++) for(int k=0; k<N; k++) { temp.a[i][j] += A.a[i][k]*B.a[k][j]; temp.a[i][j] %= mod; } return temp; } Matrix quick_multi(Matrix A, int n) { Matrix temp; memset(temp.a, 0, sizeof(temp)); for(int i=0; i<N; i++) temp.a[i][i] = 1; while(n) { if(n&1) temp = multi(temp, A); A = multi(A, A); n >>= 1; } return temp; } int main(){ int A, B, K; cin >> A >> B >> K; if(K < 2) { cout << "1" << endl; return 0; } Matrix X, Y; X.a[0][0] = (A%mod+mod)%mod, X.a[0][1] = (B%mod+mod)%mod; X.a[1][0] = 1, X.a[1][1] = 0; Y.a[0][0] = 1, Y.a[0][1] = 0; Y.a[1][0] = 1, Y.a[1][1] = 0; Matrix ans = quick_multi(X, K-2); ans = multi(ans, Y); cout << ((ans.a[0][0]%mod)+mod)%mod << endl; return 0; }