[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. MySQL5.7数据转移至SQL Server详解

    本文链接:https://blog.csdn.net/qq_37308779/article/details/80679358一.安装MySQL ODBC驱动为MySQL安装Connector/ODB ...

  2. antd不可选择时间

    //不能选择今天之前的日期<DatePicker format={this.timeFormat} showTime placeholder="项目结束日期" disable ...

  3. android出现backtrace 定位方法

  4. 51nod 1228 序列求和(伯努利数)

    1228 序列求和  题目来源: HackerRank 基准时间限制:3 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 T(n) = n^k,S(n) = T(1 ...

  5. [机器学习]Fine Tune

    Fine Tune顾名思义,就是微调.在机器学习中,一般用在迁移学习中,通过控制一些layer调节一些layer来达到迁移学习的目的.这样可以利用已有的参数,稍微变化一些,以适应新的学习任务.所以说, ...

  6. 虚树总结&题单&简要题解

    简介 虚树,即剔除所有无关结点,只保留询问点和询问点的相关结点(两两之间的LCA),建一棵新树,这棵新树就是虚树.通过虚树,可以有效的减小询问(甚至修改)的复杂度.设询问点的个数是\(k\),那么建虚 ...

  7. HDU1575--Tr A(矩阵快速幂)

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  8. GIT的安装和配置

  9. WOSA XFS 官方文档地址

    WOSA XFS 官方文档地址: ftp://ftp.cencenelec.eu/CWA/CEN/WS-XFS/

  10. js 放回上一页

    window.history.go(-1);//返回上一页不刷新 window.location.href = document.referrer;//返回上一页并刷新