#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int N=10000010,mod=20101009;
int n,m;
int p[N],pri[N],cnt,mo[N],f[N],ans;
int oula(int n){
mo[1]=1;
for(int i=2;i<=n;i++){
if(!p[i]){
pri[++cnt]=i;
mo[i]=-1;
}
for(int j=1;j<=cnt&&i*pri[j]<=n;j++){
p[i*pri[j]]=true;
if(i%pri[j]==0)break;
mo[i*pri[j]]=-mo[i];
}
}
for(int i=1;i<=n;i++){
f[i]=(f[i-1]+mo[i]*i*i)%mod;
}
}
int H(int n,int m){
return (n*(n+1)/2%mod)*(m*(m+1)/2%mod)%mod;
}
int G(int n,int m){
int cnt=0;
for(int l=1,r=0;l<=n;l=r+1){
r=min(n/(n/l),m/(m/l));
cnt=(cnt+(f[r]-f[l-1])*H(n/l,m/l))%mod;
}
return (cnt%mod+mod)%mod;
}
signed main(){
n=read(),m=read();
if(n>m)swap(n,m);
oula(m);
for(int l=1,r=0;l<=n;l=r+1){
r=min(n/(n/l),m/(m/l));
ans=(ans+((l+r)*(r-l+1)/2)%mod*G(n/l,m/l)%mod)%mod;
}
cout<<ans;
return 0;
}
不知为何,本地能过,luoguIDE 不吸氧能过,吸氧小数据RE,大数据MLE,提交全RE。