HDOJ(1005) Number Sequence

这道题,咋一看很像Fibonacci数列,使用递归或者改进的动态规划来解决。但是仔细一看,(1 <= n <= 100,000,000),使用这些方法,要么超时,要么肯定内存不够用,因此必须想别的办法。遇到这种情况也就只有找规律了。仔细看:f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7,因为存在取模运算,那么当n取到一定值后,f(n)肯定会重复出现。关于找规律的过程,博客园有一位朋友已经进行了详细分析了,请点击链接。下面给出最终的代码:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int a,b,i;
 6     long long f[55],n;
 7     while(cin>>a>>b>>n)
 8     {
 9         if(a==0&&b==0&&n==0)break;
10         f[1]=f[2]=1;
11         for(i=3;i<=49;i++)
12         f[i]=(a*f[i-1]+b*f[i-2])%7;
13         cout<<f[n%48]<<endl;
14     }
15     return 0;
16 }

 

posted @ 2015-04-28 15:02  XiaoManon  阅读(120)  评论(0编辑  收藏  举报