ACM之数列循环节

ACM之数列循环节_第1张图片
初次接触这道题,我便想到了原来的写过的斐波拉契数列,便用一个个递推的函数从n一个一个的计算,直到运算出f[n]的值,结果呢,可想而知,不是时间超时,便是堆栈溢出!
后面才知道这种题一定存在一个循环的节点,而你所做的便是通过程序或这自己的计算得到出现循环的位置!下面通过代码解释:ACM之数列循环节_第2张图片

接下来这题也是数列循环节的问题

此题便既可以通过程序寻找循环的节点,亦可以同过数学运算得到循环的节点:
第一种方法:数学运算法
数学推导
可以发现这是从2开始每隔四个出现一次
于是代码为
ACM之数列循环节_第3张图片
注意各大OJ ac的标准不是需要执行题中所给的各个步骤,只需要你在最后的时候得到的结果满足题目的要求就可以了!

接下来是一种较笨的方法,因为题中所给的数据并不算大,只到1000000,所以我们完全可以采取去不打印出它与3取余的结果,再判断输出,代码如下:
ACM之数列循环节_第4张图片
可以发现,在需求的数不大的情况下,也是可以保证时间和空间都不超而ac,附上memset函数简介:
ACM之数列循环节_第5张图片

同理,该题也可以运用上题的做法,代码如下:
ACM之数列循环节_第6张图片
最后附上取余运算常用的公式:
ACM之数列循环节_第7张图片
最后希望此文能帮助大家很好的理解数列循环节类似的问题!此文有些内容来源各网站,对此表示感谢!

                                    ————2016.3.27晚 于电子楼311

你可能感兴趣的:(数学,ACM)