Description
开始有一初始数列 a=[a1,a2,a3,···,an] ,定义 f(a,k)=[a2,a3,···,ak,a1,ak+2,ak+3,···,a2k,ak+1···] ,也就是把 a 分段,每段 k 个,若最后不足 k 个时,将剩下的组成新的一段,每段第一个移成该段最后一个。
求 f(f(f(f(f(1,2,3,···,n),2),3),···),n) 的结果。
1≤n≤106 。
Solution
考虑使用 模拟 和 找规律 来解题。
操作中是将数列按每 k 个为一段,将第一个移到最后一个的位置,其他然后往前补一格。
但我们很快可以发现,有一种等价的做法是:将第 1 个移到 k+1 个的位置,第 k+1 个移到第 2k+1 的位置,一直到第 xk+1 个移到 n+1 的位置,第 2 个到第 n+1 个组成的序列和之前的做法组成的序列是一样的。
那问题就变成了在数列中移动是 k 的倍数加 1 的数的问题。
然后这道题目就做完了,具体细节详见代码。
Code
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|