Guest User

Untitled

a guest
Jan 13th, 2012
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. #pragma comment(linker,"/STACK:300000000")
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #pragma warning(disable:4800)
  4.  
  5. #include <iostream>
  6. #include <vector>
  7. #include <string>
  8. #include <algorithm>
  9. #include <cmath>
  10. #include <map>
  11. #include <set>
  12. #include <iomanip>
  13. #include <memory.h>
  14. #include <cstdio>
  15. #include <sstream>
  16. #include <deque>
  17. #include <bitset>
  18. #include <numeric>
  19. #include <ctime>
  20. #include <queue>
  21.  
  22. using namespace std;
  23.  
  24. #define show(x) cout << #x << " = " << (x) << endl;
  25. #define fori(i,n) for(int i = 0; i < (n); i++)
  26. #define forab(i,a,b) for(int i = (a); i <= (b); i++)
  27. #define sz(v) int((v).size())
  28. #define all(v) (v).begin(),(v).end()
  29. const double pi = 3.1415926535897932384626433832795;
  30. template<class T> T abs(const T &a) { return a >= 0 ? a : -a; };
  31. template<class T> T sqr(const T &x) { return x * x; }
  32. typedef pair<int,int> ii;
  33. typedef long long ll;
  34. ///////////////////////////////////////
  35.  
  36. int n, k;
  37. ll m;
  38. vector<int> v;
  39. vector<int> ans;
  40.  
  41. ll dp[16][1<<16];
  42.  
  43. int gcd(int x, int y)
  44. {
  45.     return y ? gcd(y,x%y) : x;
  46. }
  47.  
  48. ll f(int prevInd, int mask)
  49. {
  50.     if(mask == 0)
  51.         return 1;
  52.     ll &res = dp[prevInd][mask];
  53.     if(res == -1)
  54.     {
  55.         res = 0;
  56.         fori(i,n)
  57.             if(mask&(1<<i))
  58.                 if(gcd(v[prevInd],v[i]) >= k)
  59.                     res += f(i,mask &~ (1<<i));
  60.     }
  61.     return res;
  62. }
  63.  
  64. int main()
  65. {
  66. #ifndef ONLINE_JUDGE
  67.     freopen("input.txt","r",stdin);
  68.     freopen("output.txt","w",stdout);
  69. #endif
  70.     cin >> n >> m >> k;
  71.     v.resize(n);
  72.     fori(i,n)
  73.         cin >> v[i];
  74.     memset(dp,-1,sizeof(dp));
  75.     sort(all(v));
  76.     ll t = 0;
  77.    
  78.     int mask = (1<<n)-1;
  79.     fori(_,n)
  80.     {
  81.         bool found = false;
  82.         fori(i,n)
  83.             if(ans.empty() || gcd(ans.back(),v[i]) >= k)
  84.             {
  85.                 if(mask&(1<<i))
  86.                 {
  87.                     mask &= ~(1<<i);
  88.                     ll test = f(i,mask);
  89.                     if(t+test >= m)
  90.                     {
  91.                         found = true;
  92.                         ans.push_back(v[i]);
  93.                         break;
  94.                     }
  95.                     else
  96.                     {
  97.                         t += test;
  98.                         mask |= (1<<i);
  99.                     }
  100.                 }
  101.             }
  102.         if(!found)
  103.             break;
  104.     }
  105.  
  106.     if(sz(ans) == n)
  107.         fori(i,n)
  108.             cout << ans[i] << ' ';
  109.     else
  110.         cout << -1;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment