杭电oj 水题1005的两种解的讨论
2013-05-09 21:09
465 查看
题:http://acm.hdu.edu.cn/showproblem.php?pid=1005
我的ac解
ac后发觉别人ac的的code len都比我短不少,纳闷,去搜了下别人的答案,如下
额。。不知你们发现没。该算法虽然能ac,但实际是在题目给的模7的情况下可以,如果模数M本身可能很大的时候,这个算法就过不去了,原因是它没有判断出数列
1161616161...或11345345345这类循环,那它必须扫描出所有M*M个数行。时间和空间都很不优化了。
非常非常欢迎批评指正讨论。
我的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个数行。时间和空间都很不优化了。
非常非常欢迎批评指正讨论。
相关文章推荐
- 杭电Oj 1004 1005 1008心得
- 杭电oj 1005 Number Sequence
- 杭电oj-1005
- 杭电OJ 1097 A hard puzzle(我最后的博客水题报告)
- 杭电OJ——1039 Easier Done Than Said?(水题)
- 菜鸟上路 杭电OJ 1005 从 斐波那契到 快速幂
- 杭电OJ1005题
- 杭电oj1005
- 杭电OJ——1157 Who's in the Middle(水题)
- 杭电oj 1005
- 杭电OJ——1196 Lowest Bit(水题)
- 杭电OJ——1124 Factorial(水题)
- 杭电oj1005解题
- 杭电OJ 1005 Number Sequence
- 杭电oj1005 wrong answer(待改正)
- 杭电OJ1005 水过
- 杭电oj1005
- 杭电OJ(HDOJ)1005题:Number Sequence(规律递推)
- 【杭电oj】1220 - Cube(数学水题)
- 杭电OJ(HDOJ)1032题:The 3n + 1 problem(穷举,水题)