先分析一下题,题目的意思很简单,就是给定ABn的值去求第n项的值!看到这道题先开始肯定会认为是递归,但看看数据的范围,就别想着去递归解决它,这么大数据,递归要算到何年何月,早就TLE了,其实这道题就是找规律, 或许谈不上什么高深的规律,这个规律每个人都懂,就是取余的时候肯定是存在循环的,有了这个思路,现在看看题目,是不是思路一片开阔了呢?问题是怎么找到重复呢?初始条件,f[1] = 1; f[2] = 1;当我们找到一个i 使得f[i] = 1; f[i-1] = 1;那么问题不就解决了吗?接下来是要找到循环基数,当f[i]
= 1并且f[i-1] = 1,这时候循环基数就是i-2;然后让n去对i-2取余,得到的值去f就可以了,代码如下:
/**
*@author:StormMaybin
*@Date:20160426
*@Filename:HDOJ1005.c
*@<description></desciption>
*/
# include <stdio.h>
int main (void)
{
int f[200];
int A, B, n;
int i;
while (scanf ("%d %d %d",&A, &B, &n) == 3 && A || B || n)
{
if (n > 2)
{
f[1] = 1;
f[2] = 1;
for (i = 3; i < 200; i++)
{
f[i] = (A*f[i-1] + B*f[i-2]) % 7;
if (f[i] == 1 && f[i-1] == 1)
{
break;
}
}
i -= 2;
n = n%i;
if (n == 0)
{
printf ("%d\n",f[i]);
}
else
{
printf ("%d\n",f[n]);
}
}
else
{
printf ("1\n");
}
}
return 0;
}