做完之后看了看题解,怎么一篇和我思路一样的也没有...我好慌啊qwq(所以一定是窝太弱了看不懂dalao的思路)

好吧窝的方法确实很奇怪:

核心代码只有3行 输入 循环 输出 一气呵成 是题解中的豪杰

最重要的是

没有组合数 没有容斥 没有斜率 没有向量 DA☆ZE

(只有我们的好朋友gcd


咳咳 那么开始正题(敲黑板)

首先,我们定义一个网格被一个三角形完全覆盖,当且仅当这个三角形的三个顶点都在网格边界上,并且沿着网格内部任意一条线段把网格切开,一定会把三角形切成两部分。比如下面的例子就是一个完全覆盖(渣鼠绘):

但是这个就不是:(因为沿红色竖线切开,并不能切到三角形)

那么我们发现:

  • 每个顶点都在格点上的三角形,有且只有一个可以被它完全覆盖的网格。所以只要求出原矩形当中所有子矩形的完全覆盖三角形的数量,就可以不重不漏地找出顶点都在格点上的三角形。

——但是子矩形好多啊,枚举左上角和右下角,至少是\(n^2m^2\)的数量级哇qwq

——[恋符]MasterSpark.gif 注意到我们并不关心每个子矩形的位置,而只关心它们的长宽,以及长宽均相同的矩形的数目,所以枚举子矩形的长 \(i\) 和宽 \(j\),则\(i*j\)的矩形数量为\((n-i+1)*(m-j+1)\),子矩阵数量级降为\(nm\)。

至此,原问题转化为 

**给定网格的长宽,迅速求解完全覆盖网格的三角形的数目**

继续观察,我们发现:

  • 如果某个三角形(暂且称之为\(ABC\))完全覆盖了某个网格(\(MNPQ\)),\(ABC\)一定有至少一个顶点在\(MNPQ\)的角上。

首先分析只有一个顶点在\(MNPQ\)角上的情况。不妨设\(A\)点与\(M\)点重合,为了使\(ABC\)完全覆盖\(MNPQ\),\(B\)和\(C\)必须分别在\(NP\)和\(PQ\)边上(如下图):

显然对于一个\(i*j\)的网格(这里\(i\) \(j\)指的是空格的数量而非格点,上图\(i=6,j=10\)),固定顶点的位置有四种,每种对应的另外两个顶点的位置有\((i-1)*(j-1)\)种(\(B\) \(C\)不能与\(N\) \(P\) \(Q\)重合),共\(4*(i-1)*(j-1)\)种。

分析两个顶点在\(MNPQ\)角上的情况。不妨设\(A\)与\(M\)重合。此时另外一个角上的点(不妨设为点\(B\))有三种情况:

1、\(B\)与\(N\)重合。此时\(C\)一定在\(QP\)上。共\((i-1)\)种情况。

2、\(B\)与\(Q\)重合。此时\(C\)一定在\(NP\)上。共\((j-1)\)种情况。

3、\(B\)与\(P\)重合。

这是比较麻烦的一种状态,因为此时\(C\)点可以在网格中能构成三角形的任意一处。但是我们注意到,如果线段\(AB\)除了经过\(M\) \(P\)之外,还经过了一些其他格点,\(C\)是不能与它们重合的。

那么有多少个格点被\(AB\)穿过呢qwq?

显然,不包括\(AB\)本身,有\(gcd(i,j)-1\)个(至于为什么,请读者自己思考(明明就是你自己也不会证吧kora

所以第三种情况的方案数是\((i+1)*(j+1)-4-gcd(i,j)+1\)(这里\(-4\)是因为C点不能放在网格的四个角上)。

注意到以上三种情况都可以反转,从而得到另一组与其一一对应的方案。

分析三个顶点在\(MNPQ\)角上的情况。显然只有四种。

综上,对于一个长宽为\(i,j\)的网格,可以把它完全覆盖的三角形的个数

\(S=4*(i-1)*(j-1)+2*[(i-1)+(j-1)+(i+1)*(j+1)-4-gcd(i,j)+1]+4\)

\(=6*i*j-2*gcd(i,j)\)

枚举子矩阵的复杂度为\(mn\),单次求解\(gcd\)的复杂度为\(log(m+n)\),总复杂度\(O(mnlog(m+n))\),实际运行跑的飞起。

下面是AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define R register
#define ll long long
using namespace std; int getgcd(int a, int b)
{
if (!b) return a;
return getgcd(b, a % b);
} int main()
{
ll n, m, ans = 0;
cin >> n >> m;
for (R int i = 1; i <= n; ++i)
for (R int j = 1; j <= m; ++j)
ans += (n - i + 1) * (m - j + 1) * (6 * i * j - 2 * getgcd(i, j));
cout << ans;
return 0;
}

那么这篇文章就到这里,希望对您能有帮助。ありがとナスます~

题解 P3166 【[CQOI2014]数三角形】的更多相关文章

  1. bzoj3505 / P3166 [CQOI2014]数三角形

    P3166 [CQOI2014]数三角形 前置知识:某两个点$(x_{1},,y_{1}),(x_{2},y_{2})\quad (x_{1}<x_{2},y_{1}<y_{2})$所连成 ...

  2. 【题解】洛谷P3166 [CQOI2014] 数三角形(组合+枚举)

    洛谷P3166:https://www.luogu.org/problemnew/show/P3166 思路 用组合数求出所有的3个点组合(包含不合法的) 把横竖的3个点共线的去掉 把斜的3个点共线的 ...

  3. BZOJ3505 & 洛谷P3166 [Cqoi2014]数三角形 【数学、数论】

    题目 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. 输入格式 输入一行,包含两个空格分隔的正整数m和n. 输出格式 输出 ...

  4. P3166 [CQOI2014]数三角形

    传送门 直接求还要考虑各种不合法情况,不好计数 很容易想到容斥 把所有可能减去不合法的情况剩下的就是合法情况 那么我们只要任取不同的三点就是所有可能,不合法情况就是三点共线 对于两点 $(x_1,y_ ...

  5. 洛谷P3166 [CQOI2014]数三角形

    题目描述 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形.注意三角形的三点不能共线. 输入输出格式 输入格式: 输入一行,包含两个空格分隔的正整数m和n ...

  6. Luogu P3166 [CQOI2014]数三角形 组合数学

    好题鸭.. 不好直接求三角形个数,那就用全集-补集,转化为求三点共线的数量. 具体求法是求出水平共线数量与竖直共线数量和斜线共线数量. 用排列组合的知识可知为水平和竖直的为$C_n^3$​与$C_m^ ...

  7. [CQOI2014]数三角形 题解(组合数学+容斥)

    [CQOI2014]数三角形 题解(数论+容斥) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1328780 链接题目地址:洛谷P3166 BZOJ 350 ...

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

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

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

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

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

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

随机推荐

  1. DAY 7 上午

    一些图论的题目 BZOJ 3445 Roadblock 求出最短路,枚举每条边再跑一遍即可(科技为了我 代码: #include<bits/stdc++.h> using namespac ...

  2. 十八、RF中selenium2library构造函数中参数解释

    def __init__(self,                  timeout=5.0,                  implicit_wait=0.0,                 ...

  3. 【ASK】设置网卡启动遇到的事!

    上次动笔是16年的事情了,一晃3年过去了.算了,不感慨了.直奔主题吧. 1.今天朋友要把一批win10的机器设置成网卡启动. 2.网卡是intel集成的. 3.按照主板说明已经设置成功. 4.通过wi ...

  4. 整理一下go的ci工具

    代码格式化 go fmt fileName.go goimports 自动格式化import goimports -w fileName.go mod 自动更新/删除包 go mod tidy 检查注 ...

  5. SSTap | ProxyCap

    SSTap  SSTap 全称 SOCKSTap, 是一款利用虚拟网卡技术在网络层实现的代理工具.SSTap 能在网络层拦截所有连接并转发给 HTTP, SOCKS4/5, SHADOWSOCKS(R ...

  6. 安卓和IOS抓包工具

    安卓手机抓包软件:Packet Capture,抓包精灵…… 1.Packet Capture又名无root抓包(一款依托安卓系统自身VPN来达到免Root抓取数据包的应用程序) 功能特点: 捕获网络 ...

  7. 【ABAP系列】SAP ABAP 运算符

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 运算符   前 ...

  8. Java多线程学习——知识点积累

    开启多线程时,每一个线程都拥有自己的工作空间,每个工作空间都单独的和主存打交道. 并发的概念:多个线程同时操作同一个对象 当产生并发时,如果从工作空间写入数据到内存的线程时间片用完了,其他线程再从主存 ...

  9. 第五周学习总结&第三次实验报告(String类的应用)

    第五周学习总结 1.学习了继承的相关知识点: (1) 继承的格式为class 子类 extends 父类{} (2) 继承实际上是通过子类去扩展父类的功能 (3) 一个子类只能继承一个父类,也就是说, ...

  10. python可视化:matplotlib系列

    matplotlib 的官方文档: https://matplotlib.org/users/index.html 1 子图布局管理 布局参数 紧密布局的方法 坐标轴的公用和隐藏 2 直方图bar和b ...