ZOJ2105 终于找到错误

                                  ZOJ2105:点击打开链接

错误代码

#include #include int q[110]; int main() { int a,b,n,T; while(~scanf("%d%d%d",&a,&b,&n)&&(a||b||n)) { T=0; q[1]=1;q[2]=1; q[3]=(a*q[2]+b*q[1])%7; for(int jj=4;jj<=100&&!T;jj++){ q[jj]=(a*q[jj-1]+b*q[jj-2])%7; if(q[jj]==1&&q[jj-1]==1){ T=jj-2; break; } } n=n%T; if(n==0) n=T; printf("%d\n",q[n]); } return 0; }

找到错误了,就是周期不一定包括了连续的1  1, 比如这个值域:1 1  0  1 0 1 0 ....

正确代码:

/* zoj_2105 模拟 观察 f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 将看成一个组合,则不同的组合有7*7=49中。(因为f[n-1]和f[n-2]的取值范围都是0至6) 假设循环周期为T,则f[n+T]=f[n],而T必定不超过50。找到循环周期要计算就很简单了。 */ #include  #include  #include  using namespace std; int flag[7][7]; int num[7][7]; int f[100]; int main() { int a,b,n,i; int sta,turn; while( scanf( "%d%d%d",&a,&b,&n ) && ( a||b||n ) ) { memset( flag,0,sizeof(flag) ); f[1]=1; f[2]=1; flag[1][1]=1; num[1][1]=1; for( i=3;i<=100;i++ ) { f[i]=( a*f[i-1]+b*f[i-2] )%7; if( flag[ f[i] ][ f[i-1] ]==1 ) { sta=num[ f[i] ][ f[i-1] ]; turn=i-sta-1; } else { flag[ f[i] ][ f[i-1] ]=1; num[ f[i] ][ f[i-1] ]=i-1; } } printf( "%d\n",f[ (n-sta)%turn+sta ] ); } return 0; } 


你可能感兴趣的:(简单模拟,ZOJ)