[CQOI2014]数三角形

正难则反
合法答案 = 所有三角形 - 水平(竖直)共线 - 斜共线

所有三角形
水平(竖直)共线

斜共线不好直接求,考虑枚举向量
为了保证不重不漏,第一和第二个点分别为起点与终点,第三个点在中间
对于一组,共有种可能,其中第三个点还有种可能
考虑到左右对称,答案还需要

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<cstdio>
#define LL long long
int n,m;
LL ans=0;
inline int read()
{
register int x=0,t=1;
register char ch=getchar();
while (ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if (ch=='-') t=-1,ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
LL C(LL m,LL n)
{
if (m<n) return 0;
LL ret=1;
for(LL i=1;i<=n;i++)
ret=ret*(m-i+1)/i;
return ret;
}
int main()
{
n=read()+1,m=read()+1;
ans=C(n*m,3);
ans-=C(m,3)*n+C(n,3)*m;
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\n",ans);
return 0;
}