#pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") #include #define rep(i, n) for (lli i = 0; i < (n); i++) #define rrep(i, n) for (lli i = (n)-1; i >= 0; i--) using namespace std; using lli = long long int; void YESNO(bool), YesNo(bool); template bool chmin(T1 &l, const T2 &r); template bool chmax(T1 &l, const T2 &r); struct ufind { struct node { int par, rank, size; void init(int i) { par = i; rank = 0; size = 1; } }; vector nodes; ufind(int n) { nodes.resize(n); rep(i, n) nodes[i].init(i); } int find(int x) { return nodes[x].par == x ? x : (nodes[x].par = find(nodes[x].par)); } void unite(int x, int y) { x = find(x); y = find(y); if (x == y) return; if (nodes[x].rank < nodes[y].rank) { nodes[x].par = y; nodes[y].size += nodes[x].size; } else { nodes[y].par = x; if (nodes[x].rank == nodes[y].rank) nodes[x].rank++; nodes[x].size += nodes[y].size; } } bool same(int x, int y) { return find(x) == find(y); } int size(int x) { return nodes[find(x)].size; } }; int main() { int l, r; cin >> l >> r; ufind uf(r-l+1); for(int i = l;i<=r;i++){ for(int j = i;j<=r;j+=i){ uf.unite(i-l, j-l); } } set s; rep(i, r-l+1){ s.insert(uf.find(i)); } cout << s.size()-1 < bool chmin(T1 &l, const T2 &r) { return (l > r) ? (l = r, true) : false; } template bool chmax(T1 &l, const T2 &r) { return (l < r) ? (l = r, true) : false; }