zju2105
Number Sequence
http://acm.zju.edu.cn/show_problem.php?pid=2105
Time limit: 1 Seconds
Memory limit: 32768K
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
/*written by proby*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//336 is the LCM of all cases
vector<int> temList;
int Calc(int a, int b, int n){
if(temList[n] >= 0){
return temList[n];
}
if(n==1 || n==2){
temList[n]=1;
return temList[n];
}
temList[n] = (a*Calc(a, b, n-1) + b*Calc(a, b, n-2))%7 ;
return temList[n];
}
int MyMod(double n){
while(n > 340){
n-=336;
}
return int(n);
}
void MyClear(int& n){
n=-1;
}
void MyPrint(int n){
cout<<n<<" ";
}
int main(){
int a, b, res;
double n;
cin>>a>>b>>n;
while(a!=0){
res=MyMod(n);
if(temList.capacity() < res+1){
//temList.reserve(res+1);
temList.resize(res+1);
}
for_each(temList.begin(), temList.begin()+res+1, MyClear); //"+1" is very necessary
cout<<Calc(a, b, res)<<endl;
//for_each(temList.begin(), temList.begin()+res+1, MyPrint); cout<<endl;
cin>>a>>b>>n;
}
return 1;
}