hdu 1005 Number Sequence(智寻循环节)

来源:互联网 发布:alien skin x2 mac 编辑:程序博客网 时间:2024/06/04 19:46

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(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7

A和B是确定的,而 f(n - 1)和 f(n - 2)均为0-6总共7个数,所以 (A * f(n - 1) + B * f(n - 2))的值最多有49种可能,而一对相邻数字的组合最多为49^49种,所以在这个范围内爆搜决定可以找出循环节


代码:

#include <cstring>#include <cstdio>#include <cstdlib>using namespace std;int rec[2500];int main(){    int a, b, n;rec[1] = rec[2] = 1;    scanf( "%d %d %d", &a, &b, &n );    while(!(a==0&&b==0&&n==0))    {        int beg, end, flag = 0;        for( int i = 3; i <= n && !flag; ++i )        {            rec[i] = ( a * rec[i-1] + b * rec[i-2] ) % 7;            for( int j = 2; j <= i - 1; ++j )            {                if( rec[i] == rec[j] && rec[i-1] == rec[j-1] )                {                    beg = j, end = i;                    flag = 1;                    break;                }            }        }        if( flag )        {            printf( "%d\n", rec[beg+(n-end)%(end-beg)] );        }        else            printf( "%d\n", rec[n] );        scanf( "%d %d %d", &a, &b, &n );    }    return 0;}


0 0
原创粉丝点击