Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- using namespace std;
- const int N = 1<<16;
- int n, m, k, a[20];
- int64_t cnt[20][N];
- bool g[20][20], u[20][N];
- bool vkl(int a, int x){
- return x&(1<<a);
- }
- int64_t kl(int p, int x){
- if(x==(1<<n)-1){ u[p][x] = 1; cnt[p][x] = 1; return 1LL;}
- if(u[p][x]) return cnt[p][x];
- int res = 0;
- for(int i = 0; i < n; ++i){
- if(!vkl(i,x)&&g[p][i]) res+=kl(i,x+(1<<i));
- }
- cnt[p][x] = res;
- u[p][x] = 1;
- return cnt[p][x];
- }
- int main(){
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cin >> n >> m >> k;
- for(int i = 0; i < n; ++i)
- cin >> a[i];
- sort(a,a+n);
- for(int i = 0; i < n; ++i)
- for(int j = 0; j < n; ++j)
- g[i][j] = __gcd(a[i],a[j])>=k;
- int64_t ans = 0;
- for(int i = 0; i < n; ++i) ans+=kl(i,1<<i);
- if(m>ans){ cout << -1; return 0;}
- int64_t knt = 1;
- int mn = 0, ps = 0;
- for(int i = 0; i < n; ++i){
- for(int j = 0; j < n; ++j){
- if(vkl(j,mn)||(i&&!g[ps][j])) continue;
- knt += cnt[j][mn+(1<<j)];
- if(knt>m){ cout << a[j] << " "; ps = j; knt-=cnt[j][mn+(1<<j)]; mn+=1<<j; break;}
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement