【bzoj3505】[Cqoi2014]数三角形

来源:互联网 发布:网络机顶盒和网络电视 编辑:程序博客网 时间:2024/05/29 16:30

Description

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

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

Input

输入一行,包含两个空格分隔的正整数m和n。

Output

输出一个正整数,为所求三角形数量。

Sample Input

2 2

Sample Output

76

数据范围

1<=m,n<=1000

题解
先计算取任取3个点的方案数,然后减去在同一直线上的方案数。

代码

#include<bits/stdc++.h>#define N 1005#define ll long long#define mo 1000000007using namespace std;ll ans;int n,m;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int gcd(int a,int b){if (b==0) return a;else return gcd(b,a%b);}int main(){    n=read()+1;m=read()+1;    ans=1LL*(n*m)*(n*m-1)*(n*m-2)/6;    for (int i=0;i<n;i++)    {        for (int j=0;j<m;j++)        {            if (i||j)            {                ll x=(gcd(i,j)-1)*(n-i)*(m-j);                if (i!=0&&j!=0) ans-=2*x;                else ans-=x;             }        }    }    cout<<ans;    return 0;}
原创粉丝点击