import std.stdio;
import std.array;

const(ulong)[] sieve(ulong maximum) {
	auto s = new bool[maximum];

	foreach (i;0..maximum) {
		if (s[i]) {
			continue;
		}

		auto n = i * 2 + 3;

		for (ulong j = i + n;j < maximum;j += n) {
			s[j] = true;
		}
	}

	auto a = appender!(ulong[]);
	a.put(2);
	foreach (size_t i, e;s) {
		if (!e) {
			a.put(i * 2 + 3);
		}
	}

	return a.data;
}

void main() {
	enum PrimeMaximum = 500001;
	auto primeList = sieve(PrimeMaximum);
	auto divList = new uint[primeList.length];
	ulong n;
	readf("%s", &n);

	if (n <= 1) {
		writeln(0);
		return;
	}

	auto tmpN = n;
	foreach (size_t i, p;primeList) {
		if (tmpN < p) break;

		while (tmpN % p == 0) {
			tmpN /= p;
			++divList[i];
		}
	}

	if (tmpN == n) {
		writeln(1);
		return;
	}

	ulong count;

	foreach (e;divList) {
		if (e != 0) {
			for (uint i = 1;i <= e;++i) {
				++count;
				e -= i;
			}
		}
	}

	writeln(count);
}
