HDU 1005 Number Sequence (循环节)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005 题目大意:给定f[1] = 1, f[2] = 1, f[n] = ((A*f[n-1]) + (B*f[n-2])) % 7, 求f[n]   (n最大100,000,000) 思路:f[n]显然都是小于7的,而f[n]又只与f[n-1]和f[n-2]有关,于是想到只有7*7种组合,一定可以找到循环节。 代码:  
#include 
#include 
#include 
using namespace std;

int main(){
    int vis[7][7];
    int f[100];
    int A,B,n;
    while(cin>>A>>B>>n){
        if (A + B + n == 0){
            break;
        }
        int t1 = 0, t2 = 0;
        memset(vis, 0, sizeof(vis));
        memset(f, 0, sizeof(f));
        int t = 2;
        int p1 = 1, p2 = 1;
        vis[1][1] = 1;
        f[1] = f[2] = 1;
        while(1){
            int p3 = (A * p2 + B * p1) % 7;
            p1 = p2;
            p2 = p3;
            if (!vis[p1][p2]){
                vis[p1][p2] = t;
                f[t] = p1;
                t ++;
            }
            else{
                t1 = vis[p1][p2];
                t2 = t;
                t ++;
                break;
            }
        }
        if (n < t1){
            cout<
posted @ 2012-12-24 16:02  AbandonZHANG  阅读(86)  评论(0)    收藏  举报