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 }