首页 > 其他 > 详细

hdu 1005 Number Sequence

时间:2014-07-30 20:22:44      阅读:261      评论:0      收藏:0      [点我收藏+]

这几道题倒写得很顺利,看来这几天还是有点小进步的T_T....

这道题最初只是想到可能会出现循环,后来看了个博客的分析,着重有两点

1、对于公式 f[n] = A * f[n-1] + B * f[n-2]; 后者只有7 * 7 = 49 种可能,为什么这么说,因为对于f[n-1] 或者 f[n-2] 的取值只有 0,1,2,3,4,5,6 这7个数,A,B又是固定的,所以就只有49种可能值了。

2、由该关系式得知每一项只与前两项发生关系,所以当连续的两项在前面出现过循环节出现了,注意循环节并不一定会是开始的 1,1 。 又因为一组测试数据中f[n]只有49中可能的答案,最坏的情况是所有的情况都遇到了,那么那也会在50次运算中产生循环节。找到循环节后,就可以轻松解决了。

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int A,B,n;
 5     while(~scanf("%d%d%d",&A,&B,&n)&&A&&B&&n)
 6     {
 7         int a[52],i,j,flag=0,flag2=0,k=0;
 8         a[1]=1;a[2]=1;
 9         for(i=3;i<=50;i++)
10         {
11             a[i]=(A*a[i-1]+B*a[i-2])%7;
12         }
13         for(i=1;i<=50;i++)
14         {
15             for(j=i+1;j<=50;j++)
16             {
17                 if(a[i]==a[j]&&a[i+1]==a[j+1])
18                 {flag=i;flag2=j;break;}
19             }
20             if(flag!=0)
21              break;
22         }
23         if(i==1)
24         {
25             if(n%(j-1)!=0)
26             k=a[n%(j-1)];
27             else
28             k=a[j-1];
29         }
30         else
31         {
32             if((n-(i-1))%(j-i)!=0)
33             k=a[(n-(i-1))%(j-i)+i-1];
34             else
35             k=a[j-1];
36         }
37         printf("%d\n",k);
38     }
39 }

 

hdu 1005 Number Sequence,布布扣,bubuko.com

hdu 1005 Number Sequence

原文:http://www.cnblogs.com/xurenwen/p/3878696.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!