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# (judge verdict: Accepted)

using System.Collections.Generic;
using System.Linq;
using System;

public class hello
{
    public static void Main()
    {
        var n = int.Parse(Console.ReadLine().Trim());
        string[] line = Console.ReadLine().Trim().Split(' ');
        var p = Array.ConvertAll(line, int.Parse);
        getAns(n, p);
    }
    static void getAns(int n, int[] p)
    {
        var count = 0;
        var imax = 1 << n;
        for (int i = 1; i < imax; i++)
        {
            var a = new List<int>();
            var b = new List<int>();
            for (int j = 0; j < n; j++)
            {
                if (((i >> j) & 1) == 1) a.Add(p[j]);
                else b.Add(p[j]);
            }
            var t = aLcm(a);
            if (check(t, b)) count++;
        }
        Console.WriteLine(count);
    }
    static bool check(long t, List<int> b)
    {
        foreach (var x in b)
            if (t % x == 0) return false;
        return true;
    }
    static long aLcm(List<int> a)
    {
        var acount = a.Count();
        if (acount == 1) return a[0];
        if (acount == 2) return Lcm(a[0], a[1]);
        var Lcm0 = Lcm(a[0], a[1]);
        var res = 0L;
        for (int i = 2; i < acount; i++)
        {
            res = Lcm(Lcm0, a[i]);
            Lcm0 = res;
        }
        return res;
    }
    static long Lcm(long a, long b) => a * b / gcd(a, b);
    static long gcd(long a, long b)
    {
        if (a < b) return gcd(b, a);
        while (b != 0)
        {
            var w = a % b;
            a = b;
            b = w;
        }
        return a;
    }
}