码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ3505】[Cqoi2014]数三角形 组合数

时间:2017-08-15 21:16:22      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:mil   long   范围   family   script   计算   lld   中间   ros   

【BZOJ3505】[Cqoi2014]数三角形

Description

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

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

Input

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

Output

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

Sample Input

2 2

Sample Output

76
数据范围
1<=m,n<=1000

题解:显然要用补集法,我们只需要求出三点共线的方案数即可。方法是先枚举两端的点所形成的向量,然后线段中间的点的个数就是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;
}

【BZOJ3505】[Cqoi2014]数三角形 组合数

标签:mil   long   范围   family   script   计算   lld   中间   ros   

原文地址:http://www.cnblogs.com/CQzhangyu/p/7367372.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!