找格点三角形,先是计算由随便三个点构成的图形,即C(N*M,3)
然后删掉三点共线的图形,先是考虑竖线和横线的情况,这个简单
斜线怎么办?真弱,没有想到。。 = =
枚举2个点,(两个边点),那么与它两个点共线的中间点也就确定了。其实这样的两个点,还能确定一个矩形,而在一个大矩形中,有很多类似的小矩形。。。
kuangbin的博客是这么写的,枚举矩形。。。。附代码:
#include <iostream>
#include <cstdio>
#define ss(a) scanf("%d",&a)
#define cl(a) memset(a,0,sizeof(a))
#define N 1005
#define ll long long
using namespace std;
ll C(ll n)
{
ll res=n*(n-1)*(n-2)/6;
return res;
}
int gcd(int x,int y)
{
if (y==0) return x;
else return gcd(y,x%y);
}
int main()
{
int n,m,i,j;
while (ss(n)!=EOF)
{
ss(m);
ll res=C((n+1)*(m+1));
res=res-(n+1)*C(m+1)-(m+1)*C(n+1);
for (i=2;i<=n;i++)
for (j=2;j<=m;j++)
{
ll x,y;
x=m-j+1;
y=n-i+1;
int g=gcd(i,j);
if (g>1)
{
ll re=2*(g-1)*x*y;
res-=re;
}
}
printf("%lld\n",res);
}
return 0;
}