数三角形
【题目描述】
给定一个n*m的网格,请计算三个点都在格点上的三角形共有多少个(三角形的三点不能共线)。
下图为4*4的网格上的一个三角形。
【输入描述】
输入一行,包含两个空格分隔的正整数m和n。
【输出描述】
输出一个正整数,为所求三角形的数量。
【样例输入】
样例1:
1 1
样例2:
2 2
【样例输出】
样例1:
4
样例2:
76
【数据范围及提示】
20%的数据满足:1 ≤ m,n ≤ 10;
100%的数据满足:1 ≤ m,n ≤ 1800。
源代码: #include<cstdio> int m,n; unsigned long long ans; int GCD(int t1,int t2) { if (!t2) return t1; GCD(t2,t1%t2); } int main() { scanf("%d%d",&m,&n); m++; //注意起始位置。 n++; ans=m*n; ans=ans*(ans-1)/2*(ans-2)/3; //这招妙啊。 for (int a=0;a<=n;a++) for (int b=0;b<=m;b++) if (a||b) { unsigned long long t=(GCD(a,b)-1)*(n-a)*(m-b); if (!a||!b) ans-=t; else ans-=2*t; } printf("%lld",ans); //别再犯低级错误啦! return 0; } /* 这么折腾人的题竟然只是个白银,还是太弱了。 无数解析几何的恐惧向我袭来。 所有情况:C(n*m,3)(在本题中0为起点);
三点一线: ①横竖线:n*C(m,3) + m*C(n,3); ②对角线:线段(0,0)(n-i+1,m-j+1)有(n-i+1)*(m-j+1)种平移0方案,不在坐标轴上还要算两次,且有公式:线段(a,b)(x,y)上有gcd(a-x,b-y)-1个整点(卧槽以后得好好看课件)。 */