标题:用了递归会超时啊,能优化一下吗?
只看楼主
glglzb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:22
注 册:2011-10-12
结帖率:93.33%
已结贴  问题点数:20 回复次数:14 
用了递归会超时啊,能优化一下吗?
A number sequence is defined as:
f(1) = 1;
f(2) = 1;
f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n)

输入格式
There are multiple lines of input. Every line is a test case. Each test case contains 3 integers A, B, and n on a single line (1 <= A, B <= 1000, 1 <= n <= 10000). Three zeros signal the end of input and this test case is not to be processed.
输出格式
For each test case, print the value of f(n) on a single line.
样例输入
 将样例输入复制到剪贴板
1 1 3
1 2 10
0 0 0样例输出
2
5
这是我的代码:
#include<stdio.h>
int fab (int a,int b,int c);
int main()
{
    int a,b,c;
    while(1)
    {
        scanf("%d %d %d",&a,&b,&c);
        if(a==0&&b==0&&c==0)
            break;
        else
        {
            printf("%d\n",fab(a,b,c));
        }
    }
}
int fab (int a,int b,int c)
{
    if(c==1||c==2)
    return 1;
   
    else  return (a*fab(a,b,c-1)+b*fab(a,b,c-2))%7;

}
能不能优化一下?递归会超时啊。谢谢。
搜索更多相关主题的帖子: single multiple sequence number 
2012-02-10 21:30
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:2 
你怎么知道会超时,怎么看出来的,没在程序中写检测时间的代码啊?是不是有其他的途径?

梅尚程荀
马谭杨奚







                                                       
2012-02-10 21:35
glglzb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:22
注 册:2011-10-12
得分:0 
抱歉,检测时间是1s。
2012-02-10 21:41
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:2 
显然DP, 这个递归显然耗时很大。
2012-02-10 21:59
glglzb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:22
注 册:2011-10-12
得分:0 
回复 4楼 Devil_W
那怎么优化啊?
2012-02-10 22:03
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:8 
这是一个周期函数,周期不超过49。你需要做的是找到这个周期及循环的起始位置(这类似于三角函数中的初相角)

呵呵,哪位能证明一下它为什么是一个周期函数么?

重剑无锋,大巧不工
2012-02-10 22:08
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:4 
f(n-1) 有7中结果,f(n-2)有 7种结果,可得共49种。
推论:
f(n)  == f[n%i] (i是周期)

[ 本帖最后由 Devil_W 于 2012-2-10 22:19 编辑 ]
2012-02-10 22:17
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:4 
程序代码:
#include<stdio.h>
#define M 52
int main()
{ 
    int a,b,n,i,f[M]={0,1,1},t; 
    while(scanf("%d %d %d",&a,&b,&n),a!=0||b!=0||n!=0)
    {
        a%=7;b%=7; 
        for(i=3;i<M;i++)
        { 
            f[i]=a*f[i-1]+b*f[i-2]; 
            f[i]%=7; 
            if(f[i-1]==f[3]&&f[i]==f[4]&&i>4) break;
        } 
        t=i-4; 
        if(n<4)printf("%d\n",f[n]);        
        else printf("%d\n",f[(n-4)%t+4]);
    } 
    return 0;
}
2012-02-10 22:23
glglzb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:22
注 册:2011-10-12
得分:0 
谢谢
原来优化 在很大程度上是  找到一种新的解题方法   
数学要补课啦
谢谢
2012-02-10 22:35
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
回复 7楼 Devil_W
呵呵,虽然不是严谨的证明,不过就是这么回事。

重剑无锋,大巧不工
2012-02-10 22:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-360714-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.338730 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved