//  [typescript]
class AtCoder {

  input;
  input_i;
  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: number) {
      let ob:any = {};
      var init = 2;
      while (n !== 1) {
          var i = init;
          while (i < Number.MAX_SAFE_INTEGER) {
              if(i > 1000000) {
                ob[i] = 1;
                return ob
              }
              if (n % i == 0) {
                  if (!ob[i]) {
                      ob[i] = 1;
                      break;
                  }
                  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();