#include <iostream> #include <vector> #include <cmath> template <typename T1> T1 strong(T1 x) { if(x < 1) return 1; else return strong<T1>(x - 1) * x; } struct Element { std::vector<unsigned> table; unsigned inversion; Element(std::vector<unsigned> _table) { this->table = _table; this->inversion = 0; for(unsigned i = 0; i<_table.size(); ++i) for(unsigned c = i + 1; c<_table.size(); ++c) if(table[i] > table[c]) this->inversion++; } }; template <typename t1> inline void swap(t1 &a, t1 &b) { t1 c = a; a = b; b = c; } void permutation(std::vector<std::vector<unsigned>> &x, std::vector<unsigned> table, unsigned n) { if(n < table.size() - 1) { for(unsigned i = n; i<table.size(); i++) { swap<unsigned>(table[n], table[i]); permutation(x, table, n+1); swap<unsigned>(table[n], table[i]); } } else x.push_back(table); } int main() { unsigned n, k; std::cin>>n>>k; if((1u <= n <= 250000u) && (1u <= k <= pow(10.0, 18.0))) { std::vector<std::vector<unsigned>> table; std::vector<unsigned> _table; for(unsigned i = 1; i - 1<n; ++i) _table.push_back(i); permutation(table, _table, 0); std::vector<Element> etable; for(unsigned i = 0; i<table.size(); ++i) etable.push_back(Element(table[i])); std::vector<std::vector<unsigned>> stable; for(unsigned i = 0; i<table.size(); ++i) if(etable[i].inversion == k) stable.push_back(etable[i].table); if(stable.size() >= k) { std::cout<<"TAK"<<std::endl; for(unsigned i = 0; i < n - 1; ++i) std::cout<<stable[k - 1][i]<<" "; std::cout<<stable[k - 1][n - 1]; } else std::cout<<"NIE"; } return 0; }
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 | #include <iostream> #include <vector> #include <cmath> template <typename T1> T1 strong(T1 x) { if(x < 1) return 1; else return strong<T1>(x - 1) * x; } struct Element { std::vector<unsigned> table; unsigned inversion; Element(std::vector<unsigned> _table) { this->table = _table; this->inversion = 0; for(unsigned i = 0; i<_table.size(); ++i) for(unsigned c = i + 1; c<_table.size(); ++c) if(table[i] > table[c]) this->inversion++; } }; template <typename t1> inline void swap(t1 &a, t1 &b) { t1 c = a; a = b; b = c; } void permutation(std::vector<std::vector<unsigned>> &x, std::vector<unsigned> table, unsigned n) { if(n < table.size() - 1) { for(unsigned i = n; i<table.size(); i++) { swap<unsigned>(table[n], table[i]); permutation(x, table, n+1); swap<unsigned>(table[n], table[i]); } } else x.push_back(table); } int main() { unsigned n, k; std::cin>>n>>k; if((1u <= n <= 250000u) && (1u <= k <= pow(10.0, 18.0))) { std::vector<std::vector<unsigned>> table; std::vector<unsigned> _table; for(unsigned i = 1; i - 1<n; ++i) _table.push_back(i); permutation(table, _table, 0); std::vector<Element> etable; for(unsigned i = 0; i<table.size(); ++i) etable.push_back(Element(table[i])); std::vector<std::vector<unsigned>> stable; for(unsigned i = 0; i<table.size(); ++i) if(etable[i].inversion == k) stable.push_back(etable[i].table); if(stable.size() >= k) { std::cout<<"TAK"<<std::endl; for(unsigned i = 0; i < n - 1; ++i) std::cout<<stable[k - 1][i]<<" "; std::cout<<stable[k - 1][n - 1]; } else std::cout<<"NIE"; } return 0; } |