func_code_string: #include <bits/stdc++.h>   using namespace std;   long long int a[100001], b[100001];   vector<long long int> v;   map<long long int, long long int> assign;   pair<long long int, long long int> dp[1001][7001];   inline long long int gcd(long long int a, long long int b) {     long long int tmp;     while (b) {       tmp = a % b;       a = b;       b = tmp;     }     return a;   }   int main() {     ios::sync_with_stdio(false);     ;     cin.tie(0);     ;     long long int i, j, n, k, x, y, temp, sz;     cin >> n >> k;     temp = k;     for (i = 1; i <= n; i++) {       cin >> a[i];       b[i] = gcd(a[i], k);       temp = temp / gcd(temp, a[i]);     }     if (temp != 1) {       cout <<  -1 ;       return 0;     }     if (k == 1) {       cout <<  1             <<   n ;       cout << min_element(a + 1, a + n + 1) - a;       return 0;     }     for (i = 1; i * i <= k; i++) {       if (k % i) continue;       v.push_back(i);       if (i != (k / i)) v.push_back(k / i);     }     sort(v.begin(), v.end());     sz = v.size();     for (i = 0; i < sz; i++) assign[v[i]] = i;     for (i = 1; i < sz; i++) dp[0][i] = make_pair(1000000000000, 0);     dp[0][0] = make_pair(0, 0);     for (i = 1; i <= n; i++) {       for (j = 0; j < sz; j++) {         dp[i][j] = dp[i - 1][j];         x = assign[v[j] / gcd(v[j], b[i])];         if (dp[i][j] >             make_pair(dp[i - 1][x].first + 1, dp[i - 1][x].second + a[i]))           dp[i][j] =               make_pair(dp[i - 1][x].first + 1, dp[i - 1][x].second + a[i]);       }     }     cout << dp[n][sz - 1].first <<   n ;     x = k;     for (i = n; i >= 1; i--) {       if (dp[i][assign[x]] == dp[i - 1][assign[x]]) continue;       cout << i <<    ;       x = x / gcd(x, b[i]);     }     return 0;   }   