Time Limits:
1000 ms Memory Limits: 524288 KB Detailed Limits
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)的结果。
现在,小 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。
对于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 }