组合数学 数三角形
时间限制: 1 Sec 内存限制: 128 MB
题目描述
给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。
注意三角形的三点不能共线。
输入
输入一行,包含两个空格分隔的正整数m和n。
输出
输出一个正整数,为所求三角形数量。
样例输入
2 2
样例输出
76
提示
数据范围
1<=m,n<=1000
题解:
先求出C(m*n,3)得值
再除去三个点在同一横行,竖行,对角线的情况
然后。。。。。。,就AC了
#include <cstdio>
#include <iostream>
#include <cctype>
#define mod 100003
using namespace std;
inline int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
inline void read(int &x)
{
int s=0,w=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)){s=(s<<3)+(s<<1)+ch-'0',ch=getchar();}
x=s*w;
}
long long C(long long n,long long m){
long long ans=1;
for(int i=n;i>n-m;i--)
ans*=i;
for(int i=2;i<=m;i++)
ans/=i;
return ans;
}
int main()
{
int m,n,i,j;
read(n),read(m);
n++,m++;
long long ans=C(m*n,3);
ans-=m*C(n,3);
ans-=n*C(m,3);
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
ans-=(gcd(i,j)-1)*(n-i)*(m-j)*2;
}
}
printf("%lld\n",ans);
}