题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005

#include<cstdio>
using namespace std;
int n,a,b;
struct Matrix
{
int m[2][2];
void init()
{
m[0][0] = a;
m[0][1] = 1;
m[1][0] = b;
m[1][1] = 0;
}
void init0()
{
m[0][0] = a+b;
m[0][1] = 1;
m[1][0] = 1;
m[1][1] = 1;
}
void init2()
{
m[0][0] = 1;
m[0][1] = 0;
m[1][0] = 0;
m[1][1] = 1;
}
Matrix operator * (Matrix t)
{
Matrix res;
for (int i = 0 ;i < 2; i++)
{
for (int j = 0 ;j < 2 ;j++)
{
res.m[i][j] = 0;
for (int k = 0 ;k < 2 ;k++)
res.m[i][j] += (m[i][k] * t.m[k][j]);
res.m[i][j] %= 7;
}
}
return res;
}
};
Matrix quickpow(Matrix s,int k)
{
Matrix res;
res.init2();
while(k)
{
if(k & 1)
res = res * s;
k >>= 1;
s = s * s;
}
return res;
}
int main()
{
while(scanf("%d %d %d",&a,&b,&n) && (a || b || n))
{
if(n == 1|| n == 2)
{
printf("1\n");
continue;
}
Matrix ans;
ans.init0();
Matrix t;
t.init();
ans = ans * quickpow(t ,n-2);
printf("%d\n",ans.m[0][1] % 7);
}
return 0;
}
04-27 01:26