public class Euler369 {

    static final int kMaxN = 13;
    static final int kReachStates = 1 << 16;

    static short[][] buildUpdates() {
        short[][] update = new short[kReachStates][16];
        for (int rmask = 0; rmask < kReachStates; rmask++) {
            for (int t = 0; t < 16; t++) {
                int nextMask = rmask;
                for (int matched = 0; matched < 16; matched++) {
                    if ((rmask & (1 << matched)) == 0)
                        continue;
                    int available = t & (~matched);
                    int b = available;
                    while (b != 0) {
                        int isolate = b & -b;
                        int suitBit = Integer.numberOfTrailingZeros(isolate);
                        b &= b - 1;
                        int newSubset = matched | (1 << suitBit);
                        nextMask |= (1 << newSubset);
                    }
                }
                update[rmask][t] = (short) nextMask;
            }
        }
        return update;
    }

    static String solve() {
        short[][] update = buildUpdates();
        int[] popcount = new int[16];
        for (int t = 0; t < 16; t++) {
            popcount[t] = Integer.bitCount(t);
        }

        long[][] curr = new long[kMaxN + 1][kReachStates];
        long[][] next = new long[kMaxN + 1][kReachStates];

        curr[0][1] = 1L;

        for (int rank = 0; rank < 13; rank++) {
            for (int n = 0; n <= kMaxN; n++) {
                for (int rmask = 0; rmask < kReachStates; rmask++) {
                    next[n][rmask] = 0L;
                }
            }

            for (int n = 0; n <= kMaxN; n++) {
                for (int rmask = 0; rmask < kReachStates; rmask++) {
                    long ways = curr[n][rmask];
                    if (ways == 0L)
                        continue;

                    for (int t = 0; t < 16; t++) {
                        int nn = n + popcount[t];
                        if (nn > kMaxN)
                            continue;
                        int nr = update[rmask][t] & 0xFFFF;
                        next[nn][nr] += ways;
                    }
                }
            }

            long[][] temp = curr;
            curr = next;
            next = temp;
        }

        long answer = 0L;
        for (int n = 4; n <= 13; n++) {
            long badugiHands = 0L;
            for (int rmask = 0; rmask < kReachStates; rmask++) {
                if ((rmask & (1 << 15)) != 0) {
                    badugiHands += curr[n][rmask];
                }
            }
            answer += badugiHands;
        }

        return Long.toString(answer);
    }

    public static void main(String[] args) {
        System.out.println(solve());
    }
}
