【CQOI2014】数三角形

给定一个 n×m 的网格,请计算三点都在格点上的三角形共有多少个。下图为 4×4 的网格上的一个三角形。

20171221152130_62094

注意:三角形的三点不能共线

正难则反嘛

既然三角形个数,那就算三点共线数,再用全集减去它

注意,点的个数比边要+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;
        
}



“Make my parents proud,and impress the girl I like.”
原文地址:https://www.cnblogs.com/NSD-email0820/p/9440087.html