Problem:
Score : 400 points

Problem Statement

You are given an integer N. Among the divisors of N! (= 1 \times 2 \times ... \times N), how many Shichi-Go numbers (literally "Seven-Five numbers") are there?

Here, a Shichi-Go number is a positive integer that has exactly 75 divisors.

Note

When a positive integer A divides a positive integer B, A is said to a divisor of B.
For example, 6 has four divisors: 1, 2, 3 and 6.

Constraints

1 \leq N \leq 100

N is an integer.

Input

Input is given from Standard Input in the following format:

N

Output

Print the number of the Shichi-Go numbers that are divisors of N!.

Sample Input 1

9

Sample Output 1

0

There are no Shichi-Go numbers among the divisors of 9! = 1 \times 2 \times ... \times 9 = 362880.

Sample Input 2

10

Sample Output 2

1

There is one Shichi-Go number among the divisors of 10! = 3628800: 32400.

Sample Input 3

100

Sample Output 3

543

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

#include <bits/stdc++.h>
#define rep(i, n) for(int i=0; i<(n); ++i)
#define rep2(i, s, n) for(int i=s; i<(n); ++i)
#define ALL(v) (v).begin(), (v).end()

using namespace std;

typedef long long ll;

static const int INTINF = (2147483647);
static const ll LLINF = (9223372036854775807);
static const int MAX = 1e5+1;
static const ll MOD = 1e9+7;

namespace Printer{
    template<class T>
    void print(vector<T> v){
        rep(i, v.size()){
            if(i) cout << " ";
            cout<< v[i];
        }
        cout << endl;
    }

    template<class T>
    void print(vector<vector<T> > vv){
        rep(i, vv.size()){
            rep(j, vv[i].size()){
                if(j) cout << " ";
                cout << vv[i][j];
            }
            cout << endl;
        }
    }

    void print(pair<int, int> p){
        cout << "(" << p.first << ", " << p.second << ")" << endl;
    }
};

//--global--//



//----------//

std::vector<std::vector<long long>> comb(int n, int r) {
  std::vector<std::vector<long long>> v(n + 1,std::vector<long long>(n + 1, 0));
  for (int i = 0; i < v.size(); i++) {
    v[i][0] = 1;
    v[i][i] = 1;
  }
  for (int j = 1; j < v.size(); j++) {
    for (int k = 1; k < j; k++) {
      v[j][k] = (v[j - 1][k - 1] + v[j - 1][k]);
    }
  }
  return v;
}

void calcSosu(bool *sosu){
    rep2(i, 2, 101){
        bool ok = true;
        rep2(j, 2, i){
            if(i%j == 0)ok = false;
        }
        if(ok)sosu[i] = true;
    }
}

int num(int m, int *cnt){
    int res = 0;
    rep(i, 101){
        if(cnt[i] >= m-1){
            res++;
        }
    }
    return res;
}

int main(int argc, const char * argv[]) {
    //提出時、消す----//
    //--------------//

    bool sosu[101];
    fill(sosu, sosu+101, false);
    int n;
    cin >> n;
    calcSosu(sosu);

    int cnt[101];
    fill(cnt, cnt+101, 0);
    rep2(i, 2, n+1){
        int tmp = i;
        rep(j, 101){
            if(sosu[j]){
                while(tmp % j == 0){
                    cnt[j]++;
                    tmp /= j;
                }
            }
        }
    }

    int tmp15 = 0;
    int fivefive = 0;
    int five = 0;
    int three = 0;
    rep(i, n+1){
        if(cnt[i] >= 14)tmp15++;
        if(cnt[i] >= 24)fivefive++;
        if(cnt[i] >= 4)five++;
        if(cnt[i] >= 2)three++;
        //cout << cnt [i] << endl;
    }
    three -= five;
    // cout << "res" << endl;

    // cout << num(75, cnt) <<endl;
    // cout << num(25, cnt)*(num(3, cnt)-1) <<endl;
    // cout << num(15, cnt)*(num(5, cnt)-1) <<endl;
    // cout << num(5, cnt)*(num(5, cnt)-1)*(num(3, cnt)-2) <<endl;
    cout << num(75, cnt)+num(25, cnt)*(num(3, cnt)-1)+num(15, cnt)*(num(5, cnt)-1)+num(5, cnt)*(num(5, cnt)-1)*(num(3, cnt)-2)/2 << endl;


    
    
    return 0;
}