#include #define rep(i,n) for(int i = 0; i < (int)(n); i++) #define rrep(ri,n) for(int ri = (int)(n-1); ri >= 0; ri--) #define rep2(i,x,n) for(int i = (int)(x); i < (int)(n); i++) #define rrep2(ri,x,n) for(int ri = (int)(n-1); ri >= (int)(x); ri--) #define repit(itr,x) for(auto itr = x.begin(); itr != x.end(); itr++) #define rrepit(ritr,x) for(auto ritr = x.rbegin(); ritr != x.rend(); ritr++) #define ALL(x) x.begin(), x.end() using ll = long long; using namespace std; map prime_factorization(ll n){ map ans; ll a = 2; while(n >= a*a){ if(n % a == 0){ ans[a]++; n /= a; }else{ a++; } } ans[n]++; return ans; } void dfs(vector> &vm, vector &a, int lv, int k, map &now, int sn, set> &se) { int n = vm.size(); if(lv == n) { if(k > 0) return ; se.insert(now); se.insert(prime_factorization(sn)); return ; } dfs(vm, a, lv+1, k, now, sn, se); for(auto p : vm.at(lv)) { if(p.first != 1) now[p.first] += p.second; } dfs(vm, a, lv+1, k-1, now, sn+a.at(lv), se); for(auto p : vm.at(lv)) { if(p.first == 1) continue; now[p.first] -= p.second; if(now[p.first] == 0) { now.erase(p.first); } } } int main() { int n, k; cin >> n >> k; vector> vm(n); vector a(n); rep(i, n) cin >> a.at(i); rep(i, n) { vm.at(i) = prime_factorization(a.at(i)); } set> se; map now; dfs(vm, a, 0, k, now, 0, se); // for(auto mmp : se) { // ll sum = 1; // for(auto p : mmp) { // sum *= p.first*p.second; // } // cerr << sum << endl; // } cout << se.size() << endl; return 0; }