题意:
看示例吧。
解题思路:
一开始打了个表,找了找也没规律。
后来一想,这题在动的只有每块的第一个数,其它的都是往前移,如果用stl模拟下岂不是美滋滋,然而我想vector和set去了,然后时间也不多,就gg了。
感觉还是太蠢,用队列不是就完美实现坐标前移了。
然后这个题还需要发现一个一个特性就是,每次移动就相当于所有的每块的一个数形成的序列循环右移,然后整个序列左移,就相当于一个f(p,k)了,那么n次枚举,然后用双端队列模拟就好了。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+6;
deque<int>dq;
int a[maxn];
int main()
{
int n, i, j;
cin>>n;
{
for(i=1; i<=n; i++)dq.push_back(i);
for(i=2; i<=n; i++)
{
int x, k;
for(k=(n-1)/i; k>0; k--)
{
swap(dq[(k-1)*i], dq[k*i]);
}
dq.push_back(dq.front());
dq.pop_front();
}
for(i=1; i<=n; i++){printf(i==n?"%d":"%d ", dq.front());dq.pop_front();}printf("\n");
}
}