1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 六边形地砖的差
标有数1的六边形地砖被一圈六个六边形地砖包围,这些地砖从12点钟方向(正上方)开始沿逆时针顺序依次标记为2至7。
在这个图形的外面,继续加上新的六边形地砖,接下来的几圈分别按照同样的规则标上8至19,20至37,38至61,依此类推。
考虑标有n的地砖与其周围六块地砖的差,我们定义PD(n)是这些差中素数的数目。
例如,按顺时针顺序,标有8的地砖与周围地砖的差是12,29,11,6,1和13。所以PD(8) = 3。
同样的,标有17的地砖与周围地砖的差是1,17,16,1,11和10,所以PD(17) = 2。
可以验证,PD(n)的最大值就是3。
如果所有PD(n) = 3的地砖构成从小到大排列的序列,那么第10块将是标有271的地砖。
找出这个序列中的第2000块地砖所标的数。
我的思路:枚举. 首先对点分类:每一圈有一个起点和终点,以及"边角点"(2,4,6,8,10点钟方向的点)和"链上点"(剩下的所有点)
链上点不可能是3:链上点的两端是和链上点差1的数,这个链把这个点周围的数分成两部分,剩下的四个数两组又差1,那么最多两个奇数,所以最大就是2,忽略. 边角点不可能是3:边角点在当圈会分成3-1,其中如果1那个点和当前数的差是偶数,那么3里面会出一个偶数两个奇数,不能达到3,反之会出现1个奇数两个偶数,两个奇数仍然不能达到3,所以忽略.
综上只需要枚举起点终点四周的数字即可判断,请给我c++代码实现.
起点:1,2,8,20,38,... 终点:7,19,37,...
|