HDU 1005 number sequence

一道数学题,纠结了好长时间,10^8 的话,用O(N)的算法一定会超时,考虑到模7,是一个循环问题,重要的是找出循环节,注意不一定是从f[1]出开始循环。。。

#include<iostream>
#include<cstdio>
using namespace std;
int
  f[100];
int
A,B;
long long
N;
int
find(int left,int right)
{

    for
(int i=1;i<left;i++)
    {

        if
(f[i]==f[left]&&f[i+1]==f[right])return i;
    }

    return
0;
}

int
main()
{

    int
i,j,k;
    while
(scanf("%d %d",&A,&B))
    {

        cin>>N;

        if
(!A&&!B&&!N)break;
        f[1]=1;
        f[2]=1;
        if
(N==1||N==2)
        {

            cout<<"1"<<endl;
            continue
;
        }

        int
cycle=100;
        for
(i=3;i<=N;i++)
        {

            f[i]=(A*f[i-1]+B*f[i-2])%7;
            j=find(i-1,i);
            if
(j){cycle=i-1-j;break;}
        }

        if
(j==0)cout<<f[N]<<endl;
        else

        {

            k=(N-j)%cycle;
            if
(k==0)cout<<f[j+cycle]<<endl;
            else
cout<<f[k+j]<<endl;
        }
    }

    return
0;
}

posted on 2011-07-16 13:25  lonelycatcher  阅读(245)  评论(0编辑  收藏  举报

导航