[组合数学]zoj 3647:Gao the Grid

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3647

 

大致题意:
    给出一个n*m的长方形,求三个点都在这个长方形的格点上的三角形有多少个。

 

大致思路:

    参考的网上的想法,首先先求出单纯的取三个点,能有多少种求法,再减去三点共线的错误方案数。

    计算错误的方案数要分两步

    1,要统计不在同一行或者同一列的三点共线,这里使用的方法的是,枚举这个长方形里面的长方形区域,认为两个点的位置在长方形两个对顶的脚上,再在这两个点之间选出第三个点即可。

    3,统计在同一行或者同一列上的三点共线的情况。

 

#include<iostream>
#include<cstdlib>
#include<stdio.h>
using namespace std;
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}

long long cal(int b)
{
    long long a=(long long)b;
    if(a<3)return 0;
    long long res=((a-2)*(a-1)*a);
    res/=6;
    return res;
}

int main()
{
    int n,m,i,j;
    while(cin>>n>>m)
    {
        long long ans=cal((n+1)*(m+1));
        for(i=2;i<=n;i++)
        {
            for(j=2;j<=m;j++)
            {
                long long tmp=(gcd(i,j)-1)*(n+1-i)*(m+1-j)*2;
                ans-=tmp;
            }
        }
        ans-=cal(n+1)*(m+1);
        ans-=cal(m+1)*(n+1);
        cout<<ans<<endl;
    }
    return 0;
}
 

 

你可能感兴趣的:(ACM,bbezxcy,zoj 3647,组合数学)