[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}\)算出网格中选出三个点的方案数再容斥掉不是三角形的方案是吧

想一下什么情况下不是三角形:那肯定当且仅当三点共线时啊

那么怎么把三点共线的方案数算出来呢

分两种情况:

  1. 三点共线的直线平行于\(x\)或\(y\)轴:那很简单直接组合数减掉\(\dbinom{n}{3}\)和\(\dbinom{m}{3}\)
  2. 三点共线的直线是个斜的,这个有点困难啊。。。具体看下面

首先想一个\(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]数三角形 题解(组合数学+容斥)的更多相关文章

  1. [bzoj3505][CQOI2014]数三角形_组合数学

    数三角形 bzoj-3505 CQOI-2014 题目大意:给你一个n*m的网格图,问你从中选取三个点,能构成三角形的个数. 注释:$1\le n,m\le 1000$. 想法:本来是想着等中考完了之 ...

  2. [CQOI2014]数三角形 题解(找规律乱搞)

    题面 其实这道题不用组合数!不用容斥! 只需要一个gcd和无脑找规律(滑稽 乍一看题目,如果单纯求合法三角形的话情况太多太复杂,我们可以从局部入手,最终扩展到整体. 首先考虑这样的情况: 类似地,我们 ...

  3. BZOJ 3505 [Cqoi2014]数三角形(组合数学)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3505 [题目大意] 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个. 注 ...

  4. BZOJ3505 CQOI2014数三角形(组合数学)

    显然可以用总方案数减掉三点共线的情况.对于三点共线,一个暴力的做法是枚举起点终点,其间整点数量即为横纵坐标差的gcd-1.这样显然会T,注意到起点终点所形成的线段在哪个位置是没有区别的,于是枚举线段算 ...

  5. bzoj 3505: [Cqoi2014]数三角形 组合数学

    3505: [Cqoi2014]数三角形 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 478  Solved: 293[Submit][Status ...

  6. 「BZOJ3505」[CQOI2014] 数三角形

    「BZOJ3505」[CQOI2014] 数三角形 这道题直接求不好做,考虑容斥,首先选出3个点不考虑是否合法的方案数为$C_{(n+1)*(m+1)}^{3}$,然后减去三点一线的个数就好了.显然不 ...

  7. BZOJ 3505: [Cqoi2014]数三角形 数学

    3505: [Cqoi2014]数三角形 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  8. Bzoj 3505: [Cqoi2014]数三角形 数论

    3505: [Cqoi2014]数三角形 Time Limits: 1000 ms  Memory Limits: 524288 KB  Detailed Limits   Description

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

    [BZOJ3505][Cqoi2014]数三角形 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. ...

随机推荐

  1. $.param()序列化对象

    1.$.param(): param() 方法创建数组或对象的序列化表示形式. 序列化的值可在生成 AJAX 请求时用于 URL 查询字符串中. 第一行是原始数据,第二行是序列化后的.$.param( ...

  2. SpringBoot项目中,表单的验证操作

    在创建Springboot项目中,我们使用了表单验证操作,这一操作将极大地简化我们编程的开发 1.接收数据,以及验证 @PostMapping("/save") public Mo ...

  3. jsp页面实现上传文件,并且还得支持断点续传的功能

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  4. UVa 122 Trees on the level (动态建树 && 层序遍历二叉树)

    题意  :输入一棵二叉树,你的任务是按从上到下.从左到右的顺序输出各个结点的值.每个结 点都按照从根结点到它的移动序列给出(L表示左,R表示右).在输入中,每个结点的左 括号和右括号之间没有空格,相邻 ...

  5. java语言课堂动手动脑

    1 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是 ...

  6. Java连接Oracle数据库常用方法

    JDBC的六大步骤: 注册驱动 获取连接 获取执行sql语句对象 执行sql语句 处理结果集 关闭资源 oracle URL: jdbc:oracle:thin:@localhost:1521:SID ...

  7. 箭头函数详解()=>{}

    摘要:箭头函数有几个使用注意点. (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象,箭头函数继承而来的this指向永远不变. (2)不可以当作构造函数,也就是说,不可以使用n ...

  8. Spark 2.1.1 源码编译

    Spark 2.1.1 源码编译 标签(空格分隔): Spark Spark 源码编译 环境准备与起因 由于线上Spark On Yarn Spark Streaming程序在消费kafka 写入HD ...

  9. Windows10系统内置Linux

    主要是在等电脑安装系统,有点慢,于是写个博客…… 还是那句话,从今年开始NOIP应该就不让用Windows了,所以还是尽早转Linux吧,不然NOIP考场上不会编译太尴尬对吧. 在学校电脑有Linux ...

  10. python正则之特殊表达式 .*?{}

    . 能匹配所有字符--单个字符,除了\n >>> re.match(r".","1") <_sre.SRE_Match object a ...