#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const int INF = INT_MAX;//2147483647
const int MOD = (int)1e9 + 7;
const double EPS = 1e-9;
#ifdef LOCAL_ENV
	#define debug(var) std::cout<<#var" = "<<var<<std::endl
#else
	#define debug(var)
#endif
#define p(var)  std::cout<<var<<std::endl
#define PI (acos(-1))
#define rep(i, n)   for(int i=0, i##_length=(n); i< i##_length; ++i)
#define repeq(i, n) for(int i=1, i##_length=(n); i<=i##_length; ++i)
#define all(a) (a).begin(), (a).end()
#define pb push_back
inline double isnatural(double a) { return a>=0 && ceil(a)==floor(a); }
template<typename T> inline T gcd(T a, T b) { return b ? gcd(b,a%b) : a; }
template<typename T> inline T lcm(T a, T b) { return a / gcd(a,  b) * b; }
template<typename T1, typename T2>inline bool chmax(T1 &a, T2 b) { return a < b && (a = b, true); }
template<typename T1, typename T2>inline bool chmin(T1 &a, T2 b) { return a > b && (a = b, true); }
template<typename T1, typename T2> ostream& operator<<(ostream& s, const pair<T1, T2>& p) {return s << "(" << p.first << ", " << p.second << ")";}
template<typename T> ostream& operator<<(ostream& s, const vector<T>& v) {
	for (int i = 0, len = v.size(); i < len; ++i){
		s << v[i]; if (i < len - 1) s << "\t";
	}
	return s;
}
template<typename T> ostream& operator<<(ostream& s, const vector< vector<T> >& vv) {
	for (int i = 0, len = vv.size(); i < len; ++i){
		s << vv[i] << endl;
	}
	return s;
}
template<typename T1, typename T2> ostream& operator<<(ostream& s, const map<T1, T2>& m) {
	s << "{" << endl;
	for (typeof(m.begin()) itr = m.begin(); itr != m.end(); ++itr){
		s << "\t" << (*itr).first << " : " << (*itr).second << endl;
	}
	s << "}" << endl;
	return s;
}

/*-----8<-----8<-----*/

inline static void upflag(int *flags,int BITS,int i) {
	flags[i / BITS] |= 1 << (i % BITS);
}

inline static int getflag(int *flags,int BITS,int i) {
	return (flags[i / BITS] >> (i % BITS)) & 1;
}

//MAXVAL以下の素数を詰めたvectorを返す
vector<int> eratosthenes(int MAXVAL){
	int BITS = (sizeof(int) * 8);
	int FLAGS_NUM = (MAXVAL / BITS + 1);
	int flags[FLAGS_NUM] = {};
	int i, j, f, s, count = 2;
	int max = (int)sqrt(MAXVAL) + 1;
	vector<int> primelist;
	primelist.push_back(2);
	primelist.push_back(3);
	for (i = 5, f = 4; i <= max; i += (f = 6 - f)) {
		if (!getflag(flags,BITS,i)) {
			primelist.push_back(i);
			s = MAXVAL / i;
			for (j = s - !(s & 1); j >= i; j -= 2) {
				if (!getflag(flags,BITS,i))
					upflag(flags,BITS,i*j);
			}
		}
	}
	for (; i <= MAXVAL; i += (f = 6 - f)){
		if (!getflag(flags,BITS,i)){
			primelist.push_back(i);
		}
	}
	return primelist;
}

int main() {

	vector<int> primes=eratosthenes(100);
	vector<vector<int>> soinsuu=vector<vector<int>>(101, vector<int>(101,0));
	repeq(i,100){
		int n=i;
		for(auto p:primes){
			while(n%p==0){
				n/=p;
				soinsuu[i][p]++;
			}
		}
	}

	repeq(i,99){
		repeq(k,100){
			soinsuu[i+1][k]+=soinsuu[i][k];
		}
	}

	vector<int> answerlist(101,0);
	repeq(i,100){
		int soinsuu75=0,soinsuu25=0,soinsuu15=0,soinsuu5=0,soinsuu3=0;
		repeq(j,100){
			if(soinsuu[i][j]>=74){
				soinsuu75++;
			}else if(soinsuu[i][j]>=24){
				soinsuu25++;
			}else if(soinsuu[i][j]>=14){
				soinsuu15++;
			}else if(soinsuu[i][j]>=4){
				soinsuu5++;
			}else if(soinsuu[i][j]>=2){
				soinsuu3++;
			}
		}
		int answer=0;
		int tmp25=soinsuu75+soinsuu25;
		int tmp15=soinsuu75+soinsuu25+soinsuu15;
		int tmp5=soinsuu75+soinsuu25+soinsuu15+soinsuu5;
		//5*5*3 soinsuu3 * tmp5C2
		answer+=soinsuu3*tmp5*(tmp5-1)/2;
		//5*5*3(5以上を3扱い) tmp5 * (tmp5-1)C2
		answer+=tmp5*(tmp5-1)*(tmp5-2)/2;
		//15*5
		answer+=tmp15*soinsuu5;
		//15*5(15以上を5扱い)
		answer+=tmp15*(tmp15-1);
		//25*3(15,5,3)
		int tmp15_3=soinsuu15+soinsuu5+soinsuu3;
		answer+=tmp25*tmp15_3;
		//25*3(25以上を3扱い)
		answer+=tmp25*(tmp25-1);
		//75
		answer+=soinsuu75;

		answerlist[i]=answer;
	}

	int N;
	cin >> N;
	p(answerlist[N]);
	return 0;
}



Measured memory_bytes: 256