给定一个 n×m 的网格,请计算三点都在格点上的三角形共有多少个。下图为 4×4 的网格上的一个三角形。
注意:三角形的三点不能共线
正难则反嘛
既然三角形个数,那就算三点共线数,再用全集减去它
注意,点的个数比边要+1【下面的N,M已经为n,m加1后】
明显,全集为:C(N*M,3)
横竖三点共线为:C(N,2)和C(M,2)
斜着的三点共线枚举矩形,每个符合条件的矩形中有两条三点共线【对角线】
#include<bits/stdc++.h>
using namespace std;
long long n,m,notri=0,ans=0;
int gcd(int a,int b)
{
if(!b)
return a;
return gcd(b,a%b);
}
int main()
{
scanf("%lld%lld",&n,&m);
n++;m++;
notri+=n*(n-1)*(n-2)/6*m;
notri+=m*(m-1)*(m-2)/6*n;
ans=(n*m)*(n*m-1)*(n*m-2)/6;
ans-=notri;
for(int i=1;i<n;i++)
for(int j=1;j<m;j++)
ans-=(n-i)*(m-j)*(gcd(i,j)-1)*2;
printf("%lld",ans);
return 0;
}