Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], skipTags: ["script","noscript","style","textarea","code"], processEscapes: true }});

Prime-Factor Prime

A positive integer is called a "prime-factor prime" when the number of its prime factors is prime. For example, $12$ is a prime-factor prime because the number of prime factors of $12 = 2 \times 2 \times 3$ is $3$, which is prime. On the other hand, $210$ is not a prime-factor prime because the number of prime factors of $210 = 2 \times 3 \times 5 \times 7$ is $4$, which is a composite number.

In this problem, you are given an integer interval $[l, r]$. Your task is to write a program which counts the number of prime-factor prime numbers in the interval, i.e. the number of prime-factor prime numbers between $l$ and $r$, inclusive.

Input

The input consists of a single test case formatted as follows.

$l$ $r$

A line contains two integers $l$ and $r$ ($1 \leq l \leq r \leq 10^9$), which presents an integer interval $[l, r]$. You can assume that $0 \leq r-l < 1,000,000$.

Output

Print the number of prime-factor prime numbers in $[l,r]$.

Sample Input 1

1 9

Output for Sample Input 1

4

Sample Input 2

10 20

Output for Sample Input 2

6

Sample Input 3

575 57577

Output for Sample Input 3

36172

Sample Input 4

180 180

Output for Sample Input 4

1

Sample Input 5

9900001 10000000

Output for Sample Input 5

60997

Sample Input 6

999000001 1000000000

Output for Sample Input 6

592955

In the first example, there are 4 prime-factor primes in $[l,r]$: $4,6,8,$ and $9$.

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

#include<bits/stdc++.h>
using namespace std;
using LL=long long;
#define rep(i,n) for(int i=0; i<n; i++)
#define rep1(i,n) for(int i=1; i<n; i++)
#define all(a) (a).begin(),(a).end();

bool isp[401010];
int now[1010101], cnt[1010101];

int l, r;

vector<int> build(){
  vector<int> p;
  for(int i=0; i*i<=r; i++){
    isp[i] = 1;
  }
  isp[0] = 0;
  isp[1] = 0;
  for(int i=2; i*i<=r; i++){
    if(!isp[i]) continue;
    for(LL j=i*i; j*j<=r; j+=i){
      isp[j] = 0;
    }
  }
  for(int i=0; i*i<=r; i++){
    if(isp[i]) p.push_back(i);
  }
  return p;
}

int main(){
  cin >> l >> r;
  vector<int> prime = build();
  for(int i=l; i<=r; i++) now[i-l] = i;
  for(int &p: prime){
    for(int i=(l+p-1)/p * p; i <= r; i+=p){
      while(now[i-l] % p == 0){
        now[i-l] /= p;
        cnt[i-l]++;
      }
    }
  }
  int ans = 0;
  for(int i=l; i<=r; i++){
    if(now[i-l] > 1) cnt[i-l]++;
    if(isp[cnt[i-l]] && cnt[i-l] > 0) ans++;
  }
  cout << ans << endl;
  
	return 0;
}