杭电1005

#include <iostream> 
using namespace std; 
int main(){
    int a,b,n,m;
    int f[50];
    while(cin>>a>>b>>m){
        if(a==0&&b==0&&m==0)  break;
        f[1]=1;
        f[2]=1;
        for(n=3;n!=50;n++){
            f[n]=(a*f[n-1]+b*f[n-2])%7;
            if(f[n]==1&&f[n-1]==1)
                break;
        }
        m=m%(n-2);
        if(m==0) cout<<f[n-2]<<endl;   //因为f[0]=0
        else
            cout<<f[m]<<endl;
    }
    return 0;
}

循环节

 

 

一开始的做法是:

#include <iostream>
using namespace std;
long long  F[100000001];
int a,b,n,sum;
int ff(int m){
    if(m==1||m==2) 
        return 1;
    if(F[m]!=0)
        return F[m];
    for(int i=3;i<=m;i++){
             sum=(a*ff(i-1)+b*ff(i-2))%7;
             F[i]=sum;
    }
    return F[m] ;
}
int main(){
    while(cin>>a>>b>>n){
        memset(F,0,sizeof(F));
        F[1]=F[2]=1;
        if(a==0&&b==0&&n==0)
            break;
        int s=ff(n);
        cout<<s<<endl;
    }
    return 0;

}

但是这样报错,看网上有一种解法:用循环节

%7只有7种结果,所以

 f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

f(n)有49种结果,在50之内必有循节。

 

posted @ 2015-04-04 21:06  咸咸的告别  阅读(281)  评论(0)    收藏  举报