1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
//#include <conio.h>

#define UI unsigned int

int main()
{
	UI n, k;
	std::cin >> n >> k;

	//ehh, to będzie niewydajne i malo punktowane, ale trudno już
	
	std::vector<UI> per; //permutacja
	std::set<std::vector<UI> > pers; //permutacje
	per.resize(n);
	for (UI i = 1; i <= n; i++)
		per[i-1] = i; //uzupełnienie liczby

	//zabawa na całego, hehe
	while (per[0] < n) //dopóki nie jest przekroczony zakres
	{
		//dodanie wartości
		std::vector<UI> tmp = per;
		tmp.erase(std::unique(tmp.begin(), tmp.end()), tmp.end());
		if (per == tmp)
		{
			//inwersje w persie
			UI inw = 0;
			UI inwR = 0;
			for (UI i = 1; i < n; i++) //sprawdzenie każdego elementu
			{
				for (UI j = 0; j < i; j++)
				{
					if (per[j] > per[i])
						inw++;
				}
			}
			std::reverse(per.begin(), per.end());
			for (UI i = 1; i < n; i++) //sprawdzenie każdego elementu
			{
				for (UI j = 0; j < i; j++)
				{
					if (per[j] > per[i])
						inwR++;
				}
			}
			//std::reverse(per.begin(), per.end());
			if (inw == inwR)
			{
				pers.insert(per);
				std::reverse(per.begin(), per.end());
				pers.insert(per);
			}
			else
				std::reverse(per.begin(), per.end());

		}
		//przejście do następnej możliwości
		per[n - 1]++;
		for (UI i = n - 1; i > 0; i--)
		{
			if (per[i] > n)
			{
				per[i] = 1;
				per[i - 1]++;
			}
		}
	}

	//std::cout << "GH: " << pers.size();
	if (k > pers.size())
		std::cout << "NIE";
	else
	{
		std::set<std::vector<UI> >::iterator it = pers.begin();
		std::advance(it, k-1);
		std::cout << "TAK" << std::endl;
		for (UI v : *it)
			std::cout << v << ' ';
	}

	//_getch();
	return 0;
}