HDU1005 Number Sequence 数学

来源:互联网 发布:js 获取当前协议 编辑:程序博客网 时间:2024/06/14 17:12


Number Sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 141138    Accepted Submission(s): 34258


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 31 2 100 0 0
 

Sample Output
25
 

每个f(n)均在0-6之间,故7*7=49个数字以内能找出循环,由于不确定第一个循环头的位置,故以52作为头,计算前110项左右找出循环输出即可。
#pragma warning(disable:4996) #include <vector>#include <list>#include <map>#include <set>#include <deque>#include <queue>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <complex>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <cstring>#include <ctime>                                                #include <cassert>using namespace std;#define LL long long//#define DEBUGint main(){    #ifdef DEBUG        freopen("E:\\data.in", "r", stdin);    #endif     int  a,b,n;    while (scanf("%d%d%d", &a,&b,&n) != EOF&&(a||b||n))    {        if (n == 1||n==2)        {            printf("1\n");            continue;        }        map<int, int>fn_n;        int begin, end, loop,numb[120];        numb[1] = numb[2] = 1;        for (int i = 3; i < 108; i++)            numb[i] = (a*numb[i - 1] + b*numb[i - 2])%7;        for (int  i = 54; i < 108; i++)        {            if ((numb[i]==numb[53])&&(numb[i-1]==numb[52]))            {                loop = i - 53;                break;            }        }            if (n <= 55)        {            printf("%d\n",numb[n]);        }        else        {            printf("%d\n",numb[52+((n-52)%loop)]);        }    }    return 0;}



0 0