JZ高中OJ 3403. [NOIP2013模拟] 数列变换

Description

小X 看到堆成山的数列作业十分头疼,希望聪明的你来帮帮他。考虑数列A=[A1,A2,...,An],定义变换f(A,k)=[A2,A3,,,,.Ak,A1,Ak+2,Ak+3,,,,A2k,Ak+1,...],也就是把a 分段,每段k 个(最后如果不足k 个,全部分到新的一段里,见样例),然后将每段的第一个移动到该段的最后一个。

现在,小 X想知道 f (f (f (f ([1,2,3,⋯,n],2),3),⋯),n)的结果。
 

Input

输入一行包含一个整数n 。

Output

输出一行包含n 个整数,表示最终的数列。
 

Sample Input

4

Sample Output

4 2 3 1

【样例说明】
f ([1,2,3,4],2) = [2,1,4,3]
f ([2,1,4,3],3) = [1,4,2,3](3单独被分在一组,移动到组的最后一位,仍然是3)
f ([1,4,2,3],4) = [4,2,3,1]
 

Data Constraint

对于60%的数据,1≤ n ≤10^3。

对于100%的数据,1≤ n ≤10^6。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN = 1e6+5;
 4 int a[2*MAXN], n, k;
 5 int main() {
 6     cin>>n;
 7     for (int i=1; i<=n; i++) {
 8         a[i]=i;
 9     }
10     for (int k=2; k<=n; k++) {
11         int t=0;
12         for (int i=k-1; i<=k+n-2; i+=k) {
13             swap (t, a[i]);
14         }
15         a[k+n-1]=t;
16     }
17     for (int i=n; i<=2*n-1; i++) {
18         cout<<a[i]<<" ";
19     }
20     return 0;
21 }
原文地址:https://www.cnblogs.com/dsanying/p/11306790.html