给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。
注意三角形的三点不能共线。
标签:mil long 范围 family script 计算 lld 中间 ros
给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。
注意三角形的三点不能共线。
输入一行,包含两个空格分隔的正整数m和n。
输出一个正整数,为所求三角形数量。
题解:显然要用补集法,我们只需要求出三点共线的方案数即可。方法是先枚举两端的点所形成的向量,然后线段中间的点的个数就是gcd(x,y)。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef long long ll; int m,n; ll ans; int gcd(int a,int b) {return (!b)?a:gcd(b,a%b);} ll c3(int x) {return (ll)x*(x-1)*(x-2)/6;} int main() { scanf("%d%d",&n,&m); int i,j,g; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { g=gcd(i,j); ans+=(ll)(n-i+1)*(m-j+1)*(g-1); } ans=c3((n+1)*(m+1))-ans*2-(m+1)*c3(n+1)-(n+1)*c3(m+1); printf("%lld",ans); return 0; }
标签:mil long 范围 family script 计算 lld 中间 ros
原文地址:http://www.cnblogs.com/CQzhangyu/p/7367372.html