[bzoj3505][CQOI2014]数三角形_组合数学
数三角形 bzoj-3505 CQOI-2014
题目大意:给你一个n*m的网格图,问你从中选取三个点,能构成三角形的个数。
注释:$1\le n,m\le 1000$。
想法:本来是想着等中考完了之后花上一周的时间把之前欠的blog都更掉,然后做了这道题发现网上的题解让我匪夷所思(他们写着任何人都能看懂的代码,说着只有自己才能听懂的话)。其实是这样的,求三角形个数就等价于求有多少种选取的方案使得三点共线。显然竖着的和横着的都是可以O(1)的,我们只需要计算斜着的就行了。那么,我们枚举什么才能使得在O(能过)的情况下出解?我们对于一个网格图(0,0)到(a,b),对角线上的点显然可以用gcd来求。我们已经知道了对角线上的点,然后算一下这些点所有的三点共线的方案数?算完了之后发现后面没法进行了,所以对于每一个这样的矩形我们不能直接计算。我们对于每一个a*b的网格矩形只计算这样的三点共线:这三个共线的点中外边两个点之间线段是我们枚举网格矩阵的对角线。换言之,我们对于一个已经求好了对角线上有多少整点的方格矩形,它对答案的共线就是gcd。这样计算是不会重复的,对于每一种三点共线的选取方案,只会在端点是当前枚举矩形的对角线端点是才会被计算,所以这样是不重不漏的。我们这样枚举贴在(0,0)上的矩形,紧接着算一下整个n*m的方格图里有多少这样的矩形,然后直接累计答案即可。总时间复杂度O(n*n*(gcd的log))。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int n,m;
ll ans;
ll C(int x)
{
return (ll)x*(x-1)*(x-2)/6;
}
int main()
{
scanf("%d%d",&n,&m);
n++;m++;
ans=C(n*m)-(ll)n*C(m)-(ll)m*C(n);
for (int i=1;i<n;i++)
for (int j=1;j<m;j++)
{
int num=__gcd(i,j)-1;
if (num>=1) ans-=(ll)(n-i)*(m-j)*num*2;
}
printf("%lld\n",ans);
return 0;
}
小结:好题。枚举的方式决定了解决问题的难易程度。
[bzoj3505][CQOI2014]数三角形_组合数学的更多相关文章
- BZOJ3505 CQOI2014数三角形(组合数学)
显然可以用总方案数减掉三点共线的情况.对于三点共线,一个暴力的做法是枚举起点终点,其间整点数量即为横纵坐标差的gcd-1.这样显然会T,注意到起点终点所形成的线段在哪个位置是没有区别的,于是枚举线段算 ...
- [CQOI2014]数三角形 题解(组合数学+容斥)
[CQOI2014]数三角形 题解(数论+容斥) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1328780 链接题目地址:洛谷P3166 BZOJ 350 ...
- BZOJ3505 [Cqoi2014]数三角形
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- BZOJ 3505 [Cqoi2014]数三角形(组合数学)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3505 [题目大意] 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个. 注 ...
- [bzoj3505 Cqoi2014] 数三角形 (容斥+数学)
传送门 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正 ...
- bzoj3505: [Cqoi2014]数三角形 [数论][gcd]
Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m和 ...
- 【排列组合】bzoj3505 [Cqoi2014]数三角形
http://blog.csdn.net/zhb1997/article/details/38474795 #include<cstdio> #include<algorithm&g ...
- 2018.09.09 bzoj3505: [Cqoi2014]数三角形(容斥原理+简单计数)
传送门 正难则反. 可以直接把问题转化成求出三点共线的情况数量. 如果同在一排或一列显然可以直接算,关键是如何求出斜着的. 我们知道,对于一个整点矩形. 如果长为x,宽为y,那么这个矩形任意一条对角线 ...
- bzoj3505 [Cqoi2014]数三角形——组合数+容斥
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3505 好题啊好题...好像还曾经出现在什么智力测试卷中来着...当时不会现在还是无法自己推出 ...
随机推荐
- hibernate初步2
Hibernate级联设计 数据库表之间的关系(主要关系有一对多.一对一.多对多)主要是从如下三个方面体现出来: 1.表体设计 2.实体类的设计 3.配置文件 以下是一些重要级联设计参数属性介绍: c ...
- go之数据类型转换和类型断言
一.类型转换 1.1 简单类型转换 格式 valueOfTypeB = typeB(valueOfTypeA) int 转 float64 package main import "fmt& ...
- BZOJ 3679 数位DP
思路: f[i][j]表示i位数乘积为j的方案数 j的取值最多5000多种,那就开个map存一下好了 f[i][mp[k*rec[j]]]+=f[i-1][j]; //By SiriusRen #in ...
- Spring Boot (6) Spring Data JPA
JPA 全称Java Persistence API,JPA通过JDK 5.0注解或xml描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 JPA是sun官方提出的java持久化规范, ...
- Android 判断app是否安装
1. private boolean isAppInstalled(Context context, String uri) { PackageManager pm = context.getPack ...
- Spring logger 配置
1. logback-spring.xml <?xml version="1.0" encoding="UTF-8"?> <configura ...
- ajax-工作原理,包含技术,缺陷
1:原理 2:包含技术 3:缺陷
- 分类(Category)的本质 及其与类扩展(Extension) /继承(Inherit)的区别
1.分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法. 如何创建一个分类?↓↓ ()Cmd+N, ...
- 【SQL】数值型函数
1. CEIL 语法:CEIL(n) 作用:取大于等于数值n的最小整数 SQL> select ceil(9.1),ceil(9.9),ceil(9) from dual; CEIL(9.1) ...
- 在MFC中使用Cstring
此文介绍了关于MFC使用CString的资料,可一参考一下. 转自于VC知识库:http://www.vckbase.com/index.php/wv/829 通过阅读本文你可以学习如何有效地使用 C ...