为了练习使用矩阵快速幂就写了矩阵快速幂,其实这道题更方便的做法是找规律,由于n由n-1和n-2确定,而n-1和n-2范围是0到6,所以共有7*7=49种结果,所以49必定是一个循环。
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<map>
#define MAX 3
#define MOD 7
using namespace std;
struct matr
{
int m[MAX][MAX];
void ini()
{
for(int i=1;i<=MAX;i++)
{
for(int j=1;j<=MAX;j++)
{
m[i][j]=0;
}
}
}
}res;
//int pow(int a,int b)
//{
// int ans=1;
// while(b)
// {
// if(b&1)ans=ans*a%MOD;
// a=a*a%MOD;
// b/=2;
// }
// return ans;
//}
matr mul(matr a,matr b,int n)
{
matr t;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
t.m[i][j]=0;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
t.m[i][j]+=a.m[i][k]*b.m[k][j];
t.m[i][j]%=MOD;
}
}
return t;
}
matr mpower(matr a,int b,int m)
{
matr ans;
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
{
if(i==j)
ans.m[i][j]=1;
else
ans.m[i][j]=0;
}
while(b>0)
{
if(b&1) ans=mul(ans,a,m);
a=mul(a,a,m);
b/=2;
}
return ans;
}
int main(){
int a,b,c;
while(cin>>a>>b>>c&&a&&b&&c)
{
if(c==1){printf("1\n");continue;}
else if(c==2){printf("1\n");continue;}
matr base,orig;
memset(base.m,0,sizeof(base.m));
base.m[1][1]=a;
base.m[1][2]=b;
base.m[2][1]=1;
memset(orig.m,0,sizeof(orig));
orig.m[1][1]=1;
orig.m[2][1]=1;
matr temp=mpower(base,c-2,2);
temp=mul(temp,orig,2);
cout<<temp.m[1][1]<<endl;
}
return 0;
}