总数是
ans=C3n∗m−m∗C3n−n∗C3m−斜着的总数
斜着的可以用gcd枚举 对于一个长i宽j的矩形 计算出他的对角线 有s个整数点 则该对角线的贡献是s-2(对角线上的两个顶点和其之间的一的点) 再计算出总共有多少的这么大的矩形 求和就好啦
#include<bits/stdc++.h>
#define bug(x) cout<<(#x)<<" "<<(x)<<endl
#define ll long long
/*
char *TT,*mo,but[(1<<15)+2];
#define getchar() ((TT==mo&&(mo=(TT=but)+fread(but,1,1<<15,stdin),TT==mo))?-1:*TT++)//*/
using namespace std;
const int N=1e6+5;
inline 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;
}
ll n,m,c[N][4],ans;
int main(){
#ifdef Devil_Gary
freopen("in.txt","r",stdin);
#endif
n=read()+1,m=read()+1;
if(n>m) swap(n,m);
c[0][0]=1;
for(int i=1;i<=n*m;i++){
c[i][0]=1;
for(int j=1;j<=3;j++)
c[i][j]=c[i-1][j-1]+c[i-1][j];
}
ans=c[n*m][3]-n*c[m][3]-m*c[n][3];
for(int i=1;i<n;i++)for(int j=1;j<m;j++){
int tmp=__gcd(i,j)+1;
if(tmp>2) ans-=(tmp-2)*2*(n-i)*(m-j);
}
cout<<ans<<endl;
}