class AtCoder {
    constructor() {
        // 入力系
        this.input = require('fs').readFileSync('/dev/stdin', 'utf8').split(/[\s]/);
        this.input_i = -1;
    }
    n() {
        this.input_i++;
        return Number(this.input[this.input_i]);
    }
    nn(n) {
        const a = [];
        for (let i = 0; i < n; i++) {
            a.push(this.n());
        }
        return a;
    }
    s() {
        this.input_i++;
        return String(this.input[this.input_i]);
    }
    ss(n) {
        const a = [];
        for (let i = 0; i < n; i++) {
            a.push(this.s());
        }
        return a;
    }
    // コンソール
    o(...a) {
        console.log(...a);
    }
    // Math
    abs(a) {
        return Math.abs(a);
    }
    min(...a) {
        return Math.min(...a);
    }
    max(...a) {
        return Math.max(...a);
    }
    floor(a) {
        return Math.floor(a);
    }
    ceil(a) {
        return Math.ceil(a);
    }
    round(a) {
        return Math.round(a);
    }
    // ソート
    asc(ar) {
        const t = [...ar];
        ar.sort((a, b) => { return a - b; });
    }
    desc(ar) {
        const t = [...ar];
        ar.sort((a, b) => { return b - a; });
    }
    // 自作
    gcd(...arr) {
        for (let i = 0; i < arr.length - 1; i++) {
            let [x, y] = [arr[i], arr[i + 1]];
            while (y) {
                [x, y] = [y, x % y];
            }
            arr[i + 1] = x;
        }
        return arr[arr.length - 1];
    }
    ;
    lcm(...arr) {
        for (let i = 0; i < arr.length - 1; i++) {
            let [x, y] = [arr[i], arr[i + 1]];
            while (y) {
                [x, y] = [y, x % y];
            }
            arr[i + 1] = arr[i] * arr[i + 1] / x;
        }
        return arr[arr.length - 1];
    }
    ;
    isPrime(n) {
        if (n < 2)
            return false;
        const suq = Math.sqrt(n);
        for (let i = 2; i <= suq; i++) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }
    ;
    deduplicate(a) {
        return Array.from(new Set(a));
    }
    ;
    f(roop, callback) {
        for (let i = 0; i < roop; i++) {
            callback(i);
        }
    }
    ;
    Yes() {
        console.log('Yes');
    }
    No() {
        console.log('No');
    }
    YES() {
        console.log('YES');
    }
    NO() {
        console.log('NO');
    }
}
const m = () => {
    function pf(n) {
        let ob = {};
        var init = 2;
        while (n !== 1) {
            var i = init;
            while (i < Number.MAX_SAFE_INTEGER) {
                if (n % i == 0) {
                    if (!ob[i]) {
                        ob[i] = 1;
                    }
                    else {
                        ob[i] = ob[i] + 1;
                    }
                    n = n / i;
                    break;
                }
                i = i + 1;
            }
            init = i;
        }
        return ob;
    }
    const o = new AtCoder();
    let n = o.n();
    if (n == 1) {
        return o.o(0);
    }
    if (o.isPrime(n)) {
        return o.o(1);
    }
    let ob = pf(n);
    let ans = 0;
    Object.keys(ob).forEach((key) => {
        let t = 1;
        while (ob[key] >= 0) {
            ob[key] -= t;
            t++;
            if (ob[key] >= 0)
                ans++;
        }
    });
    o.o(ans);
};
m();