您的位置:首页 > 其它

杭电oj 水题1005的两种解的讨论

2013-05-09 21:09 465 查看
题:http://acm.hdu.edu.cn/showproblem.php?pid=1005

我的ac解

#include <iostream>
using namespace std;
int main()
{
    int a,b,n;
    int count=0;
    int ans[50];
    while(true){
        cin>>a;
        cin>>b;
        cin>>n;
        if(! (a|b|n) ){
            break;
        }
        int *result=new int[49];  //7*7,两数决定下一个数
        result[0]=result[1]=1;
        int i,j;
        bool temflag=false;
        bool used[7][7];  //定义当前两个数是否出现,出现置1,再次出现即循环
        int position[7][7];  //记录数对的起始位置,当出现循环的时候,当前位置减起始位置即长度
        for(i=0;i<7;i++){
            for(j=0;j<7;j++){
                used[i][j]=0;
            }
        }
        for(i=2;i<n;i++){
            if(used[ result[i-2] ][ result[i-1] ]){
                temflag=true;//结果集有循环
                break;
            }
            used[ result[i-2] ][ result[i-1] ]=1;
            position[ result[i-2] ][ result[i-1] ]=i-2;
            result[i]=(a*result[i-1]+b*result[i-2])%7;

        }
        int resPos=i-1;
        int start=position[ result[i-2] ][ result[i-1] ];
        int len=i-2-start;
        if(temflag){
            resPos=(n-1-start)%len; //对循环串的长度取余
            resPos+=start;
        }
        ans[count++]=result[resPos];
    }
    for(int i=0;i<count;i++){
        cout<<ans[i]<<endl;
    }
    return 0;
}


ac后发觉别人ac的的code len都比我短不少,纳闷,去搜了下别人的答案,如下

#include <stdio.h>
int main()
{
        int A,B,N,a[50],i;
        while(scanf("%d%d%d",&A,&B,&N)==3&&(A||B||N)){
                a[0]=1;a[1]=1;
                for(i=2;i<50;i++){
                        a[i]=(A*a[i-1]+B*a[i-2])%7;
                        //printf("%d\n",a[i]);
                        if(i>4&&a[i]==a[2]&&a[i-1]==a[1]&&a[i-2]==a[0])break;
                }
                N%=i-2;
                if(N==0)N=i-3;
                else N--;
                printf("%d\n",a
);
        }
        return 0;
}


额。。不知你们发现没。该算法虽然能ac,但实际是在题目给的模7的情况下可以,如果模数M本身可能很大的时候,这个算法就过不去了,原因是它没有判断出数列

1161616161...或11345345345这类循环,那它必须扫描出所有M*M个数行。时间和空间都很不优化了。

非常非常欢迎批评指正讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: