// 0MS 296K 1485 B
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int modu = 7;
struct matrix{
int elem[3][3];
matrix(){
memset(elem, 0, sizeof(elem));
}
matrix operator *(const matrix a){
matrix pro;
for(int i = 0; i < 2; i ++){
for(int j = 0; j < 2; j ++){
pro.elem[i][j] = 0;
for(int k = 0; k < 2; k ++){
pro.elem[i][j] += (elem[i][k]*a.elem[k][j])%modu;
}
}
}
return pro;
}
};
matrix e, base;
// 单位矩阵和矩阵A
int f[3];
// 初始的向量
void Init(int a, int b){
e.elem[0][0] = e.elem[1][1] = 1;
base.elem[0][0] = a;
base.elem[0][1] = 1;
base.elem[1][0] = b;
base.elem[1][1] = 0;
f[0] = 1, f[1] = 1;
}
matrix power(int n){
if(n == 0) return e;
matrix ans = power(n/2);
ans = ans * ans;
if(n % 2 == 1) ans = ans * base;
return ans;
}
int solve(int n){
if(n == 1 || n ==2) return 1;
else {
matrix ans = power(n-2);
//for(int i = 0; i < 2; i ++){
// for(int j = 0; j < 2; j ++)
// printf("%d ", ans.elem[i][j]);
// printf("\n");
//}
int sum = 0;
for(int i = 0; i < 2; i ++)
sum = sum%modu + (f[i]*ans.elem[i][0])%modu;
return sum;
}
}
int main(){
int a, b, n;
while(scanf("%d%d%d", &a, &b, &n) != EOF){
if(a == 0 && b == 0 && n == 0) break;
Init(a, b);
int ans = solve(n);
printf("%d\n", ans%modu);
}
return 0;
}
hdu 1005(矩阵的应用)
最新推荐文章于 2020-09-19 22:04:44 发布