#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; using namespace atcoder; typedef long long ll; typedef pair P; using mint=modint1000000007; mint s[200020], c[200020]; mint v[200020]; int main() { ll n, m; cin>>n>>m; const mint inv6=mint(6).inv(); for(int i=1; i<=200000; i++){ c[i]=mint(i)*mint(i-1)*mint(i-2)*inv6; s[i+1]=s[i]+c[i]; } mint ans=mint(n*m)*mint(n*m-1)*mint(n*m-2)/mint(6); ans-=mint(m)*mint(n)*mint(n-1)*mint(n-2)/mint(6); ans-=mint(n)*mint(m)*mint(m-1)*mint(m-2)/mint(6); for(int d=1; d<=min(n, m); d++){ set stn, stm; for(int i=1; i<=n/d; i++){ stn.insert(n/(d*i)); //stn.insert(n/(d*i)+1); } for(int i=1; i<=m/d; i++){ stm.insert(m/(d*i)); //stm.insert(m/(d*i)+1); } auto calc=[&](int x, int y){ int x1=x, y1=y; if(x1>y1) swap(x1, y1); return s[x1+1]+s[x1]+(y1-x1)*c[x1]; }; auto sum=[&](int x){ return mint((ll)x*(x+1)/2); }; //map f; for(auto x:stn){ for(auto y:stm){ int rx=n/(x*d), lx=n/((x+1)*d); mint rxs=sum(rx), lxs=sum(lx); int ry=m/(y*d), ly=m/((y+1)*d); mint rys=sum(ry), lys=sum(ly); mint v1=((d+d*x)*(rxs-lxs)-n*mint(rx-lx)), v2=((d+d*y)*(rys-lys)-m*mint(ry-ly)); mint v3=n*mint(rx-lx)-d*x*(rxs-lxs), v4=m*mint(ry-ly)-d*y*(rys-lys); v[d]+=calc(x, y)*v1*v2; v[d]+=calc(x+1, y)*v3*v2; v[d]+=calc(x, y+1)*v1*v4; v[d]+=calc(x+1, y+1)*v3*v4; } } } for(int d=min(n, m); d>=1; d--){ for(int i=2*d; i<=min(n, m); i+=d) v[d]-=v[i]; } ans-=v[1]*2; cout<