- 题目链接
-
又是一道给出了运算公式的数学凡是没有优化的话,超时超内存等等是避免不了的了。这题很显然是一个找规律的题目,也就是该题的求解中是存在周期的。对于公式 f[n] = A * f[n-1] + B * f[n-2]; 后者只有7 * 7 = 49 种可能,为什么这么说,因为对于f[n-1] 或者 f[n-2] 的取值只有 0,1,2,3,4,5,6 这7个数,A,B又是固定的,所以就只有49种可能值了。所以该题目的关键点就在于如何找出周期。
-
虽然是一道水题,但是第一次做时还是内存超出限制了。
#include<stdio.h>
#include<algorithm>
using namespace std;
int f[60];
int main()
{
/*
逗号表达式的要领:
1.从左到右逐个计算;
2.逗号表达式作为一个整体,它的值为最后一个表达式的值;
3. 逗号表达式的优先级别在所有运算符中最低。
*/
int a, b, n;
f[0] = f[1] = f[2] = 1;
while( scanf( "%d %d %d", &a, &b, &n ), a || b || n )
{
int begin, end, flag = 0;
for( int i = 3; i <= n && !flag; i++ ) //求解循环周期 (end-begin)
{
f[i] = ( a * f[i-1] + b * f[i-2] ) % 7;
for( int j = 2; j <= i - 1; j++ )
{
if( f[i] == f[j] && f[i-1] == f[j-1] )
{
begin = j, end = i;
flag = 1;
break;
}
}
}
if( flag )
{
printf( "%d\n", f[begin+(n-end)%(end-begin)] );
}
else printf( "%d\n", f[n] );
}
return 0;
}