传送门
正难则反。
可以直接把问题转化成求出三点共线的情况数量。
如果同在一排或一列显然可以直接算,关键是如何求出斜着的。
我们知道,对于一个整点矩形。
如果长为x,宽为y,那么这个矩形任意一条对角线上有gcd(x,y)个整点。
由于n,m很小,我们直接枚举矩形的边长去掉不合法的情况就行了。
细节有点多。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,ans;
inline ll gcd(ll a,ll b){while(b){int t=a;a=b,b=t%a;}return a;}
int main(){
cin>>n>>m,++n,++m,ans=n*m*(n*m-1)*(n*m-2)/6-n*m*((n-1)*(n-2)+(m-1)*(m-2))/6;
for(ll i=2;i<n;++i)for(ll j=2;j<m;++j)ans-=2*(gcd(i,j)-1)*(n-i)*(m-j);
cout<<ans;
return 0;
}