#include<stdio.h>
#include<map>
using namespace std;
const int maxn=5000005,mod=998244353,inv2=(mod+1)/2;
long long L,R;
int ps;
int c[maxn],p[maxn],phi[maxn],sum[maxn];
map<long long,int>mp;
int ksm(int a,long long b){
int res=1;
while(b){
if(b&1)
res=1ll*res*a%mod;
a=1ll*a*a%mod,b>>=1;
}
return res;
}
void sieve(int n){
c[1]=phi[1]=sum[1]=1;
for(int i=2;i<=n;i++){
if(c[i]==0)
p[++ps]=i,phi[i]=i-1;
for(int j=1;j<=ps&&i*p[j]<=n;j++){
c[i*p[j]]=1;
if(i%p[j]==0){
phi[i*p[j]]=phi[i]*p[j];
break;
}
phi[i*p[j]]=phi[i]*(p[j]-1);
}
sum[i]=(sum[i-1]+phi[i])%mod;
}
}
int calcp(long long n){
if(n<=5000000)
return sum[n];
if(mp.count(n))
return mp[n];
int res=1ll*(n%mod)*(n%mod+1)%mod*inv2%mod;
long long l=2,r;
while(l<=n)
r=n/(n/l),res=(res-1ll*(r-l+1)%mod*calcp(n/l)%mod+mod)%mod,l=r+1;
return mp[n]=res;
}
int calch(long long n){
int res=calcp(n);
n>>=1;
while(n)
res=(res-calcp(n)+mod)%mod,n>>=1;
return res;
}
int calcf(long long n){
long long l=1,r;
int res=0,lst=0;
while(l<=n){
r=n/(n/l);
int now=(ksm(2,r+1)-2+mod)%mod;
res=(res+1ll*(now-lst+mod)*calch(n/l))%mod;
lst=now;
l=r+1;
}
return 1ll*(0ll+res+ksm(2,n+1)-2+mod)*inv2%mod;
}
int main(){
sieve(5000000);
scanf("%lld%lld",&L,&R);
printf("%d\n",(calcf(R)-calcf(L-1)+mod)%mod);
return 0;
}