裸的矩阵乘法加矩阵快速幂
下面是代码:
#include<stdio.h>
#include<string.h>
#define maxn 1010
int A,B,n;
struct node
{
int m[2][2];
void init()
{
memset(m,0,sizeof(m));
}
} a,b;
node martix_mul(node a,node b)
{
node temp;
temp.init();
for(int i = 0; i < 2; i++)
{
for(int k = 0; k < 2; k++) if(a.m[i][k])
{
for(int j = 0; j < 2; j++) if(b.m[k][j])
{
temp.m[i][j] = (temp.m[i][j] + a.m[i][k] * b.m[k][j])%7;
}
}
}
return temp;
}
node martix_power(int t)
{
node temp;
temp.init();
temp.m[0][0] = 1;
temp.m[1][1] = 1;
while(t)
{
if(t%2) temp = martix_mul(temp,b);
t = t/2;
b = martix_mul(b,b);
}
return temp;
}
int main()
{
a.m[0][0] = 1;
a.m[1][0] = 1;
a.m[0][1] = 0;
a.m[1][1] = 0;
while(scanf("%d%d%d",&A,&B,&n) && A && B && n)
{
b.m[0][0] = A%7;
b.m[0][1] = B%7;
b.m[1][0] = 1;
b.m[1][1] = 0;
if(n < 3) printf("1\n");
else
{
b = martix_power(n-2);
printf("%d\n",(b.m[0][0]+b.m[0][1])%7);
}
}
return 0;
}