数三角形

【题目描述】

给定一个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个整点(卧槽以后得好好看课件)。
*/
posted @ 2016-07-26 17:47  前前前世。  阅读(410)  评论(0编辑  收藏  举报