有一个序列是这样定义的: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;
}