http://www.lydsy.com/JudgeOnline/problem.php?id=2154
ans=∑i=1n∑j=1mlcm(i,j)=∑i=1n∑j=1mi∗j/gcd(i,j)f(x,y)=∑i=1x∑j=1yi∗j∗[gcd(i,j)==1]ans=∑d=1min(n,m)d∗f(n/d,m/d)f(x,y)=∑i=1x∑j=1yi∗j∗∑k|i,k|jμ(k)=∑k=1min(x,y)k2∗μ(k)∗∑i=1x/k∑j=1y/ki∗j另F(x,y)=∑i=1x∑j=1yi∗jf(x,y)=∑k=1min(x,y)k2∗μ(k)∗F(x/k,y/k)ans=∑d=1min(n,m)d∗∑k=1min(n/d,m/d)k2∗μ(k)∗F(n/d/k,m/d/k)另D=d∗kans=∑D=1min(n,m)F(n/D,m/D)∗∑i|Di2∗μ(i)∗(D/i)另g(D)=∑i|Di2∗μ(i)∗(D/i)ans=∑D=1min(n,m)F(n/D,m/D)∗g(D)
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int mod=20101009;
typedef long long LL;
const int N=1e7+100;
int p[N],mu[N],pri[N],pn;
LL g[N];
void init(){
int n=1e7;
//printf("%d\n",n);
memset(p,0,sizeof(p));
mu[0]=0;pn=0;mu[1]=1;
for(int i=2;i<=n;i++){
if(!p[i]){
mu[i]=-1;
pri[pn++]=i;
g[i]=(LL)(1-i)%mod;
}
for(int j=0;j<pn;j++){
if((LL)i*pri[j]>n)break;
p[i*pri[j]]=1;
if(i%pri[j]==0){
mu[i*pri[j]]=0;
g[i*pri[j]]=g[i]%mod;
break;
}
else {
mu[i*pri[j]]=-mu[i];
g[i*pri[j]]=(g[i]*g[pri[j]])%mod;
}
}
}
g[0]=0;g[1]=1;
for(int i=1;i<=n;i++){
g[i]*=i;g[i]%=mod;
g[i]+=g[i-1];g[i]%=mod;
}
}
LL F(int x,int y){
LL xx=(LL)(1+x)*x/2;xx%=mod;
LL yy=(LL)(1+y)*y/2;yy%=mod;
return (xx*yy)%mod;
}
int main(){
#ifdef DouBi
freopen("in.cpp","r",stdin);
//freopen("out1.cpp","w",stdout);
#endif // DouBi
init();
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
int r=min(n,m);
LL ans=0;
while(r>0){
//printf("%d\n",r);
int k1=n/r;
int k2=m/r;
int l1=n/(k1+1)+1;
int l2=m/(k2+1)+1;
int l=max(l1,l2);
ans+=(F(k1,k2)*(g[r]-g[l-1]))%mod;ans%=mod;
r=l-1;
}
printf("%lld\n",(ans+mod)%mod);
}
return 0;
}