基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
收藏
关注
有一个序列是这样定义的: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
矩阵快速幂模板题。
首先我们可以根据题意得出这道题的矩阵为所以我们可以得出最后的矩阵为:.最后直接上矩阵快速幂的模板就可以了。
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vec;
typedef vector<vec> mat;
typedef long long ll;
mat mul(mat &A, mat &B){
mat C(A.size(), vec(B[0].size()));
for(int i = 0; i < A.size(); i++){
for(int k = 0; k < B.size(); k++){
for(int j = 0; j < B[0].size(); j++){
C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % 7;
}
}
}
return C;
}
mat pow(mat A, ll n){
mat B(A.size(), vec(A.size()));
for(int i = 0; i < A.size(); i++){
B[i][i] = 1;
}
while(n > 0){
if(n & 1) B = mul(B,A);
A = mul(A, A);
n >>= 1;
}
return B;
}
int m[2][2];
int main(){
int a,b;
ll n;
while(~scanf("%d %d %lld",&a,&b,&n)){
mat A(3, vec(3));
a = (a % 7 + 7) % 7;
b = (b % 7 + 7) % 7;
A[0][0] = a; A[0][1] = b;
A[1][0] = 1; A[1][1] = 0;
m[0][0] = 1; m[0][1] = 0;
m[1][0] = 1; m[1][1] = 0;
A = pow(A,n-2);
int ans = 0;
for(int i = 0; i < 2; i++){
ans = (ans + (A[0][i] * m[i][0]) % 7) %7;
}
printf("%d\n", ans);
}
return 0;
}