[CQOI2014]数三角形 题解(组合数学+容斥)
[CQOI2014]数三角形 题解(数论+容斥)
标签:题解
阅读体验:https://zybuluo.com/Junlier/note/1328780
链接题目地址:洛谷P3166 BZOJ 3505
思想还是很巧妙的。。。(对于我这种菜鸡)
理解题意
首先它说\(n×m\)的网格,实际上是有\((n+1)×(m+1)\)个点来放三角形的顶点
然后就是算三角形的个数
怎么做
PS:以下所讲的所有\(n\)都是\(n+1\),\(m\)也是
可以用\(\dbinom{n×m}{3}\)算出网格中选出三个点的方案数再容斥掉不是三角形的方案是吧
想一下什么情况下不是三角形:那肯定当且仅当三点共线时啊
那么怎么把三点共线的方案数算出来呢
分两种情况:
- 三点共线的直线平行于\(x\)或\(y\)轴:那很简单直接组合数减掉\(\dbinom{n}{3}\)和\(\dbinom{m}{3}\)
- 三点共线的直线是个斜的,这个有点困难啊。。。具体看下面
首先想一个\(O(n^4)\)做法
考虑枚举三个点两端的两个点(为了不算重所以枚举两端的点)\((x,y),(X,Y)\)
显然以这两个点为两端的共线方案数就是这条线中间经过的整点数是吧
我们会得到一个结论:方案数\(=GCD(X-x,Y-y)-1\)(画个图自己应该很好理解。。。)
怎么优化成\(O(n^2)\)
我们发现其实很多直线其实长得是一样的对吧,只是放的位置不一样而已
我们考虑把这些长得一样的直线一起处理
那我们直接把\((x,y)\)当做原点,枚举\((X,Y)\)
会发现其实那些和他长得一样的直线相当于是在这种情况下于坐标网格中有限制地移动是吧
那么计算出它可以移动的方案数
这个很容易算,不就是网上移动不过\((n-X)\)次,往右移动\((m-Y)\)次嘛
那么具体算出来就是\((n-X)*(m-Y)\)次了,再乘上\(GCD(X,Y)-1\)就是要减去的辣(当然只枚举了\((X,Y)\),斜率是正的,斜率是负的就只要反过来,于是我们\(×2\))
可能有些不清楚,那么具体看代码实现
\(code\)
#include<bits/stdc++.h>
#define il inline
#define rg register
#define ldb double
#define lst long long
#define rgt register int
#define N
using namespace std;
const int Inf=1e9;
il int MAX(rgt x,rgt y){return x>y?x:y;}
il int MIN(rgt x,rgt y){return x<y?x:y;}
il int read()
{
int s=0,m=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')m=1;ch=getchar();}
while( isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
}
lst n,m,tot;
lst Ans;
lst GCD(rg lst x,rg lst y){return y?GCD(y,x%y):x;}
int main()
{
n=read()+1,m=read()+1,tot=n*m;
Ans=tot*(tot-1)*(tot-2)/6;
Ans-=n*m*(m-1)*(m-2)/6+m*n*(n-1)*(n-2)/6;
for(rg lst i=1;i<n;++i)
for(rg lst j=1;j<m;++j)
Ans-=2LL*(GCD(i,j)-1)*(n-i)*(m-j);
return printf("%lld\n",Ans),0;
}
[CQOI2014]数三角形 题解(组合数学+容斥)的更多相关文章
- [bzoj3505][CQOI2014]数三角形_组合数学
数三角形 bzoj-3505 CQOI-2014 题目大意:给你一个n*m的网格图,问你从中选取三个点,能构成三角形的个数. 注释:$1\le n,m\le 1000$. 想法:本来是想着等中考完了之 ...
- [CQOI2014]数三角形 题解(找规律乱搞)
题面 其实这道题不用组合数!不用容斥! 只需要一个gcd和无脑找规律(滑稽 乍一看题目,如果单纯求合法三角形的话情况太多太复杂,我们可以从局部入手,最终扩展到整体. 首先考虑这样的情况: 类似地,我们 ...
- BZOJ 3505 [Cqoi2014]数三角形(组合数学)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3505 [题目大意] 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个. 注 ...
- BZOJ3505 CQOI2014数三角形(组合数学)
显然可以用总方案数减掉三点共线的情况.对于三点共线,一个暴力的做法是枚举起点终点,其间整点数量即为横纵坐标差的gcd-1.这样显然会T,注意到起点终点所形成的线段在哪个位置是没有区别的,于是枚举线段算 ...
- bzoj 3505: [Cqoi2014]数三角形 组合数学
3505: [Cqoi2014]数三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 478 Solved: 293[Submit][Status ...
- 「BZOJ3505」[CQOI2014] 数三角形
「BZOJ3505」[CQOI2014] 数三角形 这道题直接求不好做,考虑容斥,首先选出3个点不考虑是否合法的方案数为$C_{(n+1)*(m+1)}^{3}$,然后减去三点一线的个数就好了.显然不 ...
- BZOJ 3505: [Cqoi2014]数三角形 数学
3505: [Cqoi2014]数三角形 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- Bzoj 3505: [Cqoi2014]数三角形 数论
3505: [Cqoi2014]数三角形 Time Limits: 1000 ms Memory Limits: 524288 KB Detailed Limits Description
- 【BZOJ3505】[Cqoi2014]数三角形 组合数
[BZOJ3505][Cqoi2014]数三角形 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. ...
随机推荐
- GET和POST请求的区别和使用场景
本质上的区别: GET请求.处理.响应过程中只是产生一个TCP数据包,而POST请求会产生两个TCP数据包. 更具体地说,GET请求过程中头和请求正文数据一起到服务器端, 而POST请求过程中, ...
- Quartz.NET常用方法 01
Quartz.NET作为一款定时框架,它的最小可运行程序如下: var scheduler = StdSchedulerFactory.GetDefaultScheduler(); scheduler ...
- Linux培训教程 浅谈:PHP在linux上执行外部命令(整理)
一.PHP中调用外部命令介绍 二.关于安全问题 三.关于超时问题 四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,可以用,1>调用专门函数 ...
- 使用webuploader组件实现大文件分片上传,断点续传
本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...
- Tensorflow在win10下的安装(CPU版本)
环境:win10,64位 1.卸载python3.7,安装python3.6 由于之前已经安装了python,到tensorflow网站查看tensorflow的支持环境,https://tensor ...
- 线下作业MySQL #20175201
1.下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECDB,导入world.sql,提交导入成功截图 2.编 ...
- pycharm中如何安装使用jieba(结巴)
PyCharm的安装以及jieba包导入 1.打开Pycharm,点击左上角 >>File >>Settings 2.在settings界面中点击Project :pyCh ...
- jQuery file upload callback options
autoUpload By default, files added to the widget are uploaded as soon as the user clicks on the star ...
- Xcode升级10.3后XIB文件报错
Xcode升级10.3后XiB文件包错,提示: Failed to find or create execution context for description '<IBCocoaTouch ...
- RandomAccessFile 文件读写中文乱码解决方案!
RandomAccessFile 读写文件时,不管文件中保存的数据编码格式是什么 使用 RandomAccessFile对象方法的 readLine() 都会将编码格式转换成 ISO-8859-1 ...