#include #include using namespace std; using namespace atcoder; // デバッグ表示 #define dump(x) cout << #x << ":" << (x) << endl; // 型定義 typedef long long ll; typedef pair P; // forループ #define REP(i,n) for(ll i=0; i<(ll)(n); ++i) // 定数宣言 const int INF = 1e9; const int MOD = 1e9+7; const ll LINF = 1e18; // modint using mint = modint1000000007; // using mint = modint998244353; // グラフ表現 using Graph = vector>; // グラフの辺表現 using Edge = map,int>; // n次元配列の初期化。第2引数の型のサイズごとに初期化していく。 template void Fill(A (&array)[N], const T &val){ std::fill( (T*)array, (T*)(array+N), val ); } // コンビネーションを計算する関数 ll pow(ll N, ll k) { ll res = 1; for (ll i = 0; i < k; ++i) res *= N; return res; } // 最大公約数 ll gcd(ll a,ll b){ if (a%b == 0) return(b); else return(gcd(b, a%b)); } // 最小公倍数 ll lcm(ll a, ll b){ return a/gcd(a, b) * b; } //template #define rrep(i,a,b) for(int i=(a);i>(b);i--) #define ALL(v) (v).begin(),(v).end() template inline bool chmax(T& a,T b){ if(a inline bool chmin(T& a,T b){ if(a>b){a=b;return 1;}return 0; } //end struct BIT{ int n; vector val; BIT(int _n):n(_n),val(_n+1,0){} void add(int i,int x){for(i++;i<=n;i+=i&-i)val[i]+=x;} int sum(int i){int res=0; for(i++;i;i-=i&-i)res+=val[i]; return res;} }; constexpr int R=1010101; constexpr int C=10101; bitset isp; vector ps,cs; void init(int c){ ps.clear(); cs.clear(); isp[0]=isp[1]=1; for(int p=2;p*p<=R;p++)if(!isp[p]){ for(int q=p*p;q<=R;q+=p)isp[q]=1; } for(int i=2;i mu(a+1,1),minp(a+1,a); for(int i=1;i sum(cnt,0); for(ll lo=1;lo is_one; for(int b=0;bp){ res-=mu[m]*(sum[b]+x/p/m-lo+1-bit.sum(x/p/m-lo)); } } sum[b]+=a-bit.sum(a-1); for(int q=(p-lo%p)%p;q=a;s+=c){ vector cur(c+1,0); bitset val; cur[0]=b; for(int i=0;i=a){res-=cur[x/ps[idx]-s]; idx--;} } return res; } int main() { cout << fixed << setprecision(15); ll L, R; cin >> L >> R; ll ans = pi(R) - pi(L-1) + pi(2*R-1) - pi(2*L); cout << ans << endl; return 0; }