#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned int ui; const ll mod = 1000000007; const ll INF = (ll)1000000007 * 1000000007; typedef pair P; #define stop char nyaa;cin>>nyaa; #define rep(i,n) for(int i=0;i=0;i--) #define Rep(i,sta,n) for(int i=sta;i=sta;i--) #define rep1(i,n) for(int i=1;i<=n;i++) #define per1(i,n) for(int i=n;i>=1;i--) #define Rep1(i,sta,n) for(int i=sta;i<=n;i++) typedef long double ld; typedef complex Point; const ld eps = 1e-8; const ld pi = acos(-1.0); typedef pair LP; ll h,w; int n; vector a,b,c,prime; void solve(){ cin >> h >> w; n=max(h,w); vector isprime(n,true); Rep(i,2,n+1){ if (!isprime[i]) continue; prime.push_back(i); //cout << i << endl; Rep(k,2,n+1){ if(k*i>n) break; isprime[k*i]=false; } } rep(i,n+1){ a.push_back(max(h-(ll)i,0ll)); b.push_back(max(w-(ll)i,0ll)); } for(auto p:prime){ per(i,(n+1)/p+1){ if(i*p>n) continue; a[i]+=a[i*p]; b[i]+=b[i*p]; a[i]%=mod; b[i]%=mod; } } rep(i,n+1){ //cout << i << " " << a[i] << " " << b[i] << endl; c.push_back(a[i]*b[i]%mod); } for(auto p:prime){ rep(i,(n+1)/p+1){ if(i*p>n) continue; c[i]-=c[i*p]; c[i]+=mod; c[i]%=mod; } } cout << (2*c[1]+h*(w-1)+w*(h-1))%mod << endl; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout << fixed << setprecision(50); solve(); }