HDU1005 Number Sequence

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005

 

本来看到题目分类里说这是一道水题,然后就想灌一下水,后来做了一下发现还是有些价值的。。。

第一眼看到数据,n有1Y大,直接递推肯定不行的啦,光开数组也得超啊。剩下就是找规律了,f[n]和f[n+1]的组合只有7*7=49种,所以肯定有周期,而且周期在小于50的时候肯定会出现,重点就是找周期了,可以用vis[7][7]二维数组标记下,当出现过的组合再次出现时,就是周期所在了,剩下的就水了。。。

 

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 int s[55],vis[7][7];
 4 int main ()
 5 {
 6     int a,b,n;s[1] = 1;s[2] = 1;
 7     while (~scanf ("%d%d%d",&a,&b,&n)&&(a+b+n))
 8     {
 9         int i;
10         memset (vis,0,sizeof (vis));
11         vis[1][1] = 1;
12         for (i = 3;i<=50;++i)
13         {
14             s[i] =  (a*s[i-1]+b*s[i-2])%7;
15             if (vis[s[i]][s[i-1]])break;
16             vis[s[i]][s[i-1]] = 1;
17         }
18         if (n<=i){printf ("%d\n",s[n]);continue;}
19         int j;
20         for (j = 1;j<=50;++j)
21             if (s[j]==s[i-1]&&s[j+1]==s[i])break;
22         int t = i-j-1,dex;
23         dex = j-1+((n-j+1)%t?(n-j+1)%t:t);
24         printf ("%d\n",s[dex]);
25     }
26     return 0;
27 }

 

posted on 2014-03-23 22:43  round_0  阅读(113)  评论(0编辑  收藏  举报

导航