#include "cstdio"
#include "string"
#include "algorithm"
using namespace std;
constexpr int N=1e7+5,P{20101009};
int n,m;
int mu[N],mtts[N];
basic_string<int> prime;
void sieve(int n){
static int d[N];
mu[1]=1,d[1]=1;
for(int i{2};i<=n;++i){
if(!d[i]){
d[i]=i,mu[i]=-1;
prime+=i;
}
for(int j:prime){
int t{i*j};
if(t>n||d[i]<j) break;
d[t]=j;
if(i%j==0) break;
mu[t]=-mu[i];
}
}
for(int t{1};t<=n;++t){
mtts[t]=(mtts[t-1]+1LL*((mu[t]+P)%P)*t%P*t%P)%P;
}
}
int vsum(int l,int r){
return 1LL*(l+r)*(r-l+1ll)/2ll%P;
}
signed main(){
scanf("%d%d",&n,&m);
sieve(max(n,m));
int ans{0},mi{min(n,m)};
for(int l1{1},r1;l1<=mi;l1=r1+1){
r1=(mi/(mi/l1));
int sum{0};
for(int l2{1},r2;l2<=mi/l1;l2=r2+1){
r2=min((n/l1)/((n/l1)/l2),(m/l1)/((m/l1)/l2));
sum=(sum+1LL*((mtts[r2]-mtts[l2-1]+P)%P)*vsum(1,n/l1/l2)%P*vsum(1,m/l1/l2)%P)%P;
}
ans=(ans+1LL*vsum(l1,r1)*sum%P)%P;
}
printf("%d\n",ans);
return 0;
}