有关递归效率
来源:百度知道 编辑:UC知道 时间:2024/06/08 03:55:02
Function f( n ) is recursively defined as:
f( n ) = f(n-1) + f(n-3), n > 3
f( n ) = n, n <= 3
Write a program to calculate f( n ) modulo m.
n <= 10000, 2 <= m <= 10000.
Hint
If n is a negative number, use (n % m + m) % m to calculate n modulo m.
Input
There are multiple test cases. Each test case consists of two integers: n and m. n = 0 and m = 0 denotes the end of input, and you should not process this case.
Output
For each test case, print f( n ) modulo m in a single line.
Sample Input
1 2
10000 999
0 0Sample Output
1
433
这个堆栈肯定不会溢出的,关键是运用动态规划思想,算过的数就记录下来,下次如果再算它就可以直接返回值就可以了。
#include <cstdio>
int n, m, f[ 10001 ];
int work( int p )
{
    if ( f[ p ] != -1 )
        return f[ p ];
    return f[ p ] = ( work( p - 3 ) + work( p - 1 ) ) % m;
}
int main( )
{
    int i;
    while ( scanf("%d%d", &n, &m) != EOF )
    {
        if ( n == 0 && m == 0 )
            break;
        for ( i = 1; i <= 3; i++ )
            f[ i ] = i % m;
        for ( i = 4; i <= n; i++ )
            f[ i ] = -1;
     &nb