#include <cstdio>
#include <algorithm>
int d[10];
// lexicographical_order: 11.888 ms
void lexicographical_order(const int size)
{
int tot = 1, i, j;
for (i = 0; i < size; i++) d[i] = i+1, tot *= i+1;
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
while (--tot)
{
i = size - 2;
while (d[i] > d[i+1]) i--;
j = size - 1;
while (j != i) {
if (d[j] > d[i]) {
std::swap(d[j], d[i]);
break;
} else j--;
}
i++;
j = size - 1;
while (i < j) {
std::swap(d[i], d[j]);
i++; j--;
}
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
}
}
// incremental_way: 87.111 ms
void incremental_way(const int size)
{
int p[10], tot = 1, i, j, k, l;
for (i = 0; i < size; i++) d[i] = i+1, tot *= i+1, p[i] = tot;
tot = 0;
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
while (++tot < p[size-1])
{
i = 0;
while (tot % p[i+1] == 0) i++;
j = 0;
k = 0;
for (j = 0; j < size; j++) {
if (d[j] <= i+1) {
d[j] = i+2 - d[j];
k = j;
} else if (d[j] == i+2) {
std::swap(d[j], d[k]);
}
}
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
}
}
// decremental_way: ? ms
void decremental_way(const int size)
{
int tot = 1, i, j, k, l;
for (i = 0; i < size; i++) d[i] = i+1, tot *= i+1;
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
while (--tot)
{
i = 0; while (d[i] + i == size) i++;
if (i) {
j = i; while (j < size) d[j-i] = d[j], j++;
j = i; while (j) d[size-j] = size-j+1, j--;
}
j = size-i-1; while (d[j] != size-i) j--;
std::swap(d[j], d[j-1]);
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
}
}
int main()
{
// lexicographical_order(10);
// incremental_way(10);
decremental_way(10);
return 0;
}