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 }

 

转载请注明出处:http://www.cnblogs.com/michaelwong/p/4284945.html

posted @ 2015-02-10 21:26  HelloMichaelWong  阅读(611)  评论(0编辑  收藏  举报