省赛过后,每天都要练题,保持状态,持续进步。
题目大意:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005。
大体思路:一开始采用打表,尝试找规律,输入了很多组数,每组数都有一定的规律,根据题意:f [ n ] = ( A * f [ n - 1 ] + B * f [ n - 2 ] ) % 7,可以知道,当A和B都为7的倍数时,f [ n ] (n>=2) 肯定为0,所以这种情况可以单独列,基本上每组数的规律都是两个连续的1开头,所以打表(足够长就行了),判断连续的两个1的位置,记录周期长。
以下是ac代码:
#include<stdio.h>
int main(){
int A,B,i;
long n;
int f[201];
f[1]=f[2]=1;
while(scanf("%d %d %ld",&A,&B,&n)){
if(A==0&&B==0&&n==0)
break;
int ans;
if(A%7==0&&B%7==0){
if(n<=2)
ans=1;
else
ans=0;
}
else{
for(int i=3;i<=200;i++)
f[i]=(A*f[i-1]+B*f[i-2])%7;
int cnt; //这里如果初始化为cnt=1会wa,不知道为什么。。。
for(int i=2;i<=200;i++){
if(f[i+1]==1&&f[i+2]==1)
cnt=i;
}
n%=cnt;
if(n==0)
n=cnt;
ans=f[n];
}
printf("%d\n",ans);
}
return 0;
}