Number Sequence
问题陈述:
杭州电子科技大学HANGZHOU DIANZI UNIVERSITY Online Judge Problem - 1005
问题解析:
最初看到这个题目,第一感觉直接套公式递归求解,结果报Runtime Error STACK_OVERFLOW。递归层太多,导致栈溢出。再次分析发现,因为(a + b) mod m = (a mod m + b mod m) mod m,所以本题f(n)可以写成f(n) = (A*f(n-1) mod 7 + B*f(n-2) mod 7) mod 7, 而f(x) mod 7 可以取0~6七种值,所以f(n-1) mod 7 + f(n-2) mod 7至多有49中情况,即f(n)至多有49个值,可以把f(1)~f(49)看做一个循环,超出这个范围,对49去余即可。
代码详解:
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int f[50]; 7 int func(int, int, int); 8 9 int main() 10 { 11 int a, b, n; 12 while(scanf("%d%d%d", &a, &b, &n) && a||b||n) { 13 printf("%d\n", func(a, b, n)); 14 } 15 return 0; 16 } 17 18 int func(int a, int b, int n) { 19 int i; 20 if(n==1 || n==2) { 21 return 1; 22 }else { 23 f[1] = f[2] = 1; 24 for(i=3; i<50; i++) { 25 f[i] = (a*f[i-1] + b*f[i-2])%7; 26 if(n == i) { 27 return f[i]; 28 } 29 } 30 f[0] = f[49]; 31 return f[n%49]; 32 } 33 }