Problem:
アカベコ２０

　

「アカベコ２０」は、イヅア地方の専用劇場で公演を開催しているグループです。アカベコ２０のそれぞれのメンバーは、ある一定の日数ごとに公演に参加することになっています。

今日の公演ではメンバーが全員参加していました。プロデューサーであるあなたは、メンバーから、今後の公演のメンバーの組み合わせを教えてほしい、と頼まれました。あなたは、公演に参加するメンバーの組み合わせがいくつあるのかを数えることにしました。

アカベコ２０のメンバー数と、それぞれのメンバーが公演に参加する周期が１日単位で与えられたとき、参加するメンバーの組み合わせが何通りあるかを数えるプログラムを作成せよ。このとき、グループは同じメンバーで永遠に存続すると仮定する。ただし、だれも参加しない場合は組み合わせに含めないこととする。

入力

入力は以下の形式で与えられる。

$N$
$p_1$ $p_2$ ... $p_N$

１行目にアカベコ２０のメンバー数$N$ ($1 \leq N \leq 20$)が与えられる。続く１行に、それぞれのメンバーが公演に参加する周期$p_i$ ($1 \leq p_i \leq 40$)が与えられる。

出力

参加するメンバーの組み合わせの数を１行に出力する。

入出力例

入力例１

3
3 5 2

出力例１

7

入力例２

3
2 3 6

出力例２

3

周期が２日のメンバーのみが参加する公演，周期が３日のメンバーのみが参加する公演，周期が２日、３日、６日のメンバーが参加する公演の３通りとなる。

Solution in C++14 (judge verdict: Accepted)

#include <iostream>
//#include <iomanip>
//#include <string>
#include <vector>
//#include <algorithm>
//#include <utility>
//#include <set>
//#include <map>
//#include <stack>
//#include <deque>
#include <bitset>
//#include <math.h>
using namespace std ;
using ll = long long ;
//using ld = long double ;
using vll = vector<ll> ;
//using vvll = vector<vll> ;
//using vc = vector<char> ;
//using vvc = vector<vc> ;
//using vb = vector<bool> ;
//using vvb = vector<vb> ;
//using pll = pair<ll,ll> ;

//ll mod = 1000000007 ;
//long double pie = acos(-1) ;

//void yorn(bool a){if(a) cout << "Yes" << endl ; else cout << "No" << endl ;}
//void YorN(bool a){if(a) cout << "YES" << endl ; else cout << "NO" << endl ;}
ll gcd(long long a,long long b){if(b==0) return a ; return gcd(b,a%b) ;}
ll lcm(long long a,long long b){return a/gcd(a,b)*b ;}
//ll sa(long long a,long long b){if(a>b) return a-b ; return b-a ;}
//void mysort(vector<long long> &a){sort(a.begin(),a.end()) ;}
//void myrev(vector<long long> &a){reverse(a.begin(),a.end()) ;}

int main(){
	ll n ; cin >> n ;
	vll p(n) ;
	for(auto &i:p) cin >> i ;
	ll ans = 0 ;
	for(int i=1;i<(1<<n);i++){
		bitset<25> bit(i) ;
		ll num = -1 ;
		bool ok = true ;
		for(int j=0;j<n;j++){
			if(bit[j]){
				if(num==-1) num = p.at(j) ;
				else num = lcm(num,p.at(j)) ;
			}
		}
		for(int j=0;j<n;j++){
			if(!bit[j]){
				if(num%p.at(j)==0){
					ok = false ;
					break ;
				}
			}
		}
		ans += ok ;
	}
	cout << ans << endl ;
}