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
题目大意
求f(n);
思路
首先第一眼看到数据范围1 <= A, B <= 1000, 1 <= n <= 100,000,000,暴力肯定超时。找规律可以发现循环节。对于f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.f(n-1)情况只可能有七种:0,1,2,3,4,5,6。同理f(n-2),又因为A,B是固定的,所以f(n)的情况最多就7*7=49种,f(n)只与前两项有关系,所以前两项如果产生循环节,那么在50次内f(n)也必定会产生循环节。至此我们就可以缩小数据范围,只需要把n%49参与运算就可以了。
代码
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
long long int calculate(int a,int b,long long int n)
{
long long int temp_1,temp_2;
long long int sumtemp;
for(int i=1;i<=n;i++)
{
if(i==1||i==2) {temp_1=1,temp_2=1;continue;}
sumtemp=(a*temp_2+b*temp_1)%7;
temp_1=temp_2;
temp_2=sumtemp;
}
return sumtemp;
}
int main()
{
long long int n;
int a,b;
while(scanf("%d %d %lld",&a,&b,&n)!=EOF)
{
if(a==0&&b==0&n==0) break;
long long int sum=calculate(a,b,n%49);
printf("%d\n",sum);
}
}