这个题目如果使用数组或者递归都会爆栈,注意到题目中的数都是对7取余,所以相邻的两个数的组合最多有49中,所以最多49次循环就会从头开始循环,这是就可以不用继续执行了,然后将n对i取余,根据余数就可以得到结果。
C++代码:
#include<stdio.h>
const int N=55;
int dp[N];
int getRes(int A,int B,int n){
if(n==1||n==2)
return 1;
else{
dp[1]=1;dp[2]=1;int i;
for(i=3;i<=N;i++){
dp[i]=(A*dp[i-1]+B*dp[i-2])%7;
if(dp[i]==dp[i-1]&&dp[i-1]==1)
break;
}
i-=2;
n=n%i;
if(n)
return dp[n];
else
return dp[i];
}
}
int main(){
int a,b,n;
while(scanf("%d%d%d",&a,&b,&n)!=EOF){
if(a==0&&b==0&&n==0)
return 0;
printf("%d\n",getRes(a,b,n));
}
return 0;
}