有个结论:(x1,y1)和(x2,y2)连线上的整点的个数为GCD(x1-x2,y1-y2)-1个。
利用全集-补集,O(1)求出来所有情况减去三点共网格线的,再减去共斜线的即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long n,m;
long long ans=0;
long long gcd(long long x,long long y) {return y?gcd(y,x%y):x;}
int main() {
scanf("%lld%lld",&n,&m);
ans=((n+1)*(m+1)*((n+1)*(m+1)-1)*((n+1)*(m+1)-2)/6-(n+1)*(m+1)*(m-1)*m/6-(n+1)*(m+1)*n*(n-1)/6);
for(long long i=1;i<=n;i++)
for(long long j=1;j<=m;j++)
ans-=2ll*(gcd(i,j)-1)*(n-i+1)*(m-j+1);
cout<<ans;
}