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

你可能感兴趣的:(sequence)