Number Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 178667 Accepted Submission(s):
44395
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).
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
题解:虽然n的数字可以很大
但是它每一次都会对于7取余
所以可能会出现循环节
找到对应的循环节 这题目就很简单了
1 #include<stdio.h> 2 #include<cmath> 3 #include<iostream> 4 #include<cstring> 5 #include<algorithm> 6 #include<queue> 7 using namespace std; 8 int rec[60]; 9 int main() 10 { 11 int a, b, n; 12 rec[0] = rec[1] = rec[2] = 1; 13 while( scanf( "%d %d %d", &a, &b, &n ), a | b | n ) 14 { 15 int beg, end, flag = 0; 16 for( int i = 3; i <= n && !flag; ++i ) 17 { 18 rec[i] = ( a * rec[i-1] + b * rec[i-2] ) % 7; 19 for( int j = 2; j <= i - 1; ++j ) 20 { 21 if( rec[i] == rec[j] && rec[i-1] == rec[j-1] ) 22 { 23 beg = j, end = i; 24 flag = 1; 25 break; 26 } 27 } 28 } 29 if( flag ) 30 { 31 printf( "%d ", rec[beg+(n-end)%(end-beg)] ); 32 } 33 else 34 printf( "%d ", rec[n] ); 35 } 36 return 0; 37 }