## https://yukicoder.me/problems/no/1653 import math def main(): L, R = map(int, input().split()) # 10 ** 6 以下の素数をまず列挙 target_max = 10 ** 6 primes = [] is_prime = [True] * (target_max + 1) for p in range(2, target_max + 1): if not is_prime[p]: continue x = 2 * p primes.append(p) while x <= target_max: is_prime[x] = False x += p target_divisors = {} for l in range(L, R + 1): target_divisors[l] = [] for p in primes: q = R // p v = q * p while v >= L: if v in target_divisors: target_divisors[v].append(p) if v % (p ** 2) == 0: del target_divisors[v] v -= p # 残ったtarget_divisorたちから10**6以下の数字を割っていく answer = 0 for v, single_divisors in target_divisors.items(): for d in single_divisors: v //= d if v == 1: answer += 1 continue low = 0 high = 10 ** 9 while high - low > 1: mid = (high + low) // 2 if mid ** 2 <= v: low = mid else: high = mid if high ** 2 <= v: w = high else: w = low if w ** 2 < v: answer += 1 print(answer) if __name__ == "__main__": main()