方法一:找循环节点,因为最多49次,所以代码如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
int f[1000];
int main()
{
int a,b,n,i,j;
int k[7][7];
f[1]=1;f[2]=1;
while (scanf("%d%d%d",&a,&b,&n),a||b||n)
{
memset(k,0,sizeof(k));
k[1][1]=2;
for (i=3;i<=50;i++)
{
f[i]=a*f[i-1]+b*f[i-2];
f[i]%=7;
if (k[f[i]][f[i-1]]) break;
k[f[i]][f[i-1]]=i;
}
j=i-k[f[i]][f[i-1]];
n-=k[f[i]][f[i-1]];
n%=j;
if (n==0) n+=j;
n+=k[f[i]][f[i-1]];
printf("%d\n",f[n]);
}
}
方法二:快速幂算矩阵,代码如下:
#include <stdio.h>
int matrix[2][2],main_matrix[2][2]={{1,1},{0,0}};
int a_matrix[2][2],b_matrix[2][2];
int a,b,n;
void build()
{
matrix[0][0]=a;
matrix[0][1]=1;
matrix[1][0]=b;
matrix[1][1]=0;
}
void f()
{
int i,j,k;
for (i=0;i<2;i++)
for (j=0;j<2;j++)
{
a_matrix[i][j]=main_matrix[i][j];
b_matrix[i][j]=matrix[i][j];
}
if (n%2==1)
{
n--;
for (i=0;i<2;i++)
for (j=0;j<2;j++)
{
main_matrix[i][j]=0;
for (k=0;k<2;k++)
main_matrix[i][j]+=a_matrix[i][k]*b_matrix[k][j];
main_matrix[i][j]%=7;
}
}
else
{
n/=2;
for (i=0;i<2;i++)
for (j=0;j<2;j++)
{
matrix[i][j]=0;
for (k=0;k<2;k++)
matrix[i][j]+=b_matrix[i][k]*b_matrix[k][j];
matrix[i][j]%=7;
}
}
}
int main ()
{
int c,i,j;
while (scanf("%d%d%d",&a,&b,&n),a||b||n)
{
main_matrix[0][0]=1;main_matrix[0][1]=1;
main_matrix[1][0]=0;main_matrix[1][1]=0;
a%=7;b%=7;
build();
n-=2;
while (n!=0)
{
f();
}
printf("%d\n",main_matrix[0][0]%7);
}
}