Number Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 105414 Accepted Submission(s): 25611
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).
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Data
{
bool f;
int wei;
}flag[100];
int res[110];
int main()
{
for (int i = 0; i < 100; i++)
{
flag[i].f = false;
flag[i].wei = 0;
}
int a, b, n;
while (scanf("%d %d %d", &a, &b, &n) != EOF && a && b && n)
{
for (int i = 0; i < 100; i++)
{
flag[i].f = false;
flag[i].wei = 0;
}
memset(res, 0, sizeof(res));
res[1] = 1;
res[2] = 1;
int len = 1, num = 3;
bool f = false;
flag[11].f = true;
flag[11].wei = 1;
int wei;
while (!f)
{
res[num] = (a * res[num - 1] + b * res[num - 2]) % 7;
int temp = res[num] * 10 + res[num - 1];
if(flag[temp].f)
{
f = true;
len = num - 2 - flag[temp].wei + 1;
wei = flag[temp].wei;
}
else
{
flag[temp].f = true;
flag[temp].wei = num - 1;
num++;
}
}
if (n <= wei - 1)
printf("%d\n", res[n]);
else
{
int r = (n - wei + 1) % len;
if (r == 0)
printf("%d\n", res[wei + len - 1]);
else
printf("%d\n", res[wei + r - 1]);
}
}
return 0;
}