Number Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 73223 Accepted Submission(s): 17033
Problem Description
A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n).
Input
The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.
Output
For each test case, print the value of f(n) on a single line.
Sample Input
1 1 3 1 2 10 0 0 0
Sample Output
2 5
Author
CHEN, Shunbao
Source
Recommend
JGShining
一般来说第一眼看完题肯定想到用循环嵌套对吧。
呵呵,这样肯定超时
还好这个结果是有规律的,当然,意识到结果是有规律的这点很难得
比如说A=B=1;
那么f(n)依次为
1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0,1 1......
所以说只要用数组保存一个循环然后根据n算出对应的f(n)即可
#includeint main() { long n; int A,B,f[200]; while(scanf("%d %d %ld",&A,&B,&n)!=EOF&&A&&B&&n) { int j; for(j=0;j<200;j++) { f[j]=0; } if(n==1||n==2) printf("1\n"); else { long i; f[1]=1; f[2]=1; for(i=3;i<200;i++) { f[i]=(A*f[i-1]+B*f[i-2])%7; if(f[i]==1&&f[i-1]==1) break; } i=i-2; f[0]=f[i]; printf("%d\n",f[n%i]); } } return 0;}