题目描述

链接:牛客网 三角形个数


分析与代码

非常好的一道题目,我一直认为找规律、分类的题是相当重要的,这也能变向提高你的问题分析能力,思维能力,状态划分能力。本题是相当不错的题目,在小学奥数中经常让来计数。大学中就让直接求规律了啊哈哈~

分类

首先,得想到用 增量 的方式来考虑该问题。边场为 n 的三角形就比边长为 n - 1 的三角形多了最底边上构成的三角形,我们只需要统计这些 增量 三角形的个数即可。

将整个图形分为正三角形和倒三角形,来分别考虑其规律,我就在这贴官方的本次比赛的题解了:

这个分类的思想就很重要,就能将问题不重不漏的进行简化!

但是我觉得官方给的这个 Java 代码不太容易使人理解…下面我自己写了份,加了备注。

第一版代码,计算每一层的三角形增量的个数

#include <iostream>using namespace std;typedef long long LL;const int N = 20210420, MOD = 1e9+7;LL a[N], b[N], c[N];int main() {int n = 20210411;for (LL i = 2; i <= n; i ++ ) {if (i & 1) b[i] += (b[i - 2] + (i - 1)) % MOD; // 奇数,b[i] 为第i层,且i为奇数的增量倒三角形else c[i] += (c[i - 2] + (i - 1)) % MOD; // 偶数,同理}for (LL i = 1; i <= n; i ++ ) {// 它的增量是 (i * (i + 1)) / 2,再顺手算一个前缀和a[i] += a[i - 1] + (i * (i + 1)) / 2 % MOD; // a[i] 是第1~i层的所有正三角形个数if (i & 1) a[i] += b[i]; // 这样写就很好理解了,奇数层加奇数层的倒三角else a[i] += c[i];a[i] %= MOD;}cout << a[n] << endl;return 0;
}

第二版代码,直接计算前 i 层的正三角形个数、倒三角形的个数:

#include <iostream>using namespace std;typedef long long LL;const LL N = 20210420, MOD = 1e9+7;LL a[N], b[N], c[N];int main() {int n = 20210411;// 每一层的正三角形个数for (LL i = 1; i <= n; i ++ ) a[i] += (a[i - 1] + (i * (i + 1) / 2)) % MOD;// 每一层新增的倒三角形个数for (LL i = 2; i <= n; i ++ ) {if (i & 1) b[i] += (b[i - 2] + (i - 1)) % MOD;          // 奇数else c[i] += (c[i - 2] + (i - 1)) % MOD;                // 偶数}for (LL i = 1; i <= n; i ++ ) b[i] = (b[i] + b[i - 1]) % MOD, c[i] = (c[i] + c[i - 1]) % MOD;cout << (a[n] + b[n] + c[n]) % MOD << endl;return 0;
}

第三版代码,在做题过程中,关于倒三角的增量公式确实是 (n-1)+(n-3)+(n-5)+... 其实完全可以用等差数列求和来得到这个增量值。

可以分两种情况:

  • n 为奇数的情况的时候,尾项必然是 0。
  • n 为偶数的情况的时候,尾项必然是 1。
  • 故,只需要计算得到项数即可使用等差数列求和公式 n(a1+an)2\frac {n(a_1+a_n)} 22n(a1​+an​)​。
  • 假设项数为 kkk ,此时 d=−2d=-2d=−2,即有 (n−1)−2(k−1)≥0(n-1)-2(k-1) \geq 0(n−1)−2(k−1)≥0 简单分类讨论就能得到不论奇数还是偶数的情况项数都能统一到 (i−1)2\frac {(i-1)} 22(i−1)​ 。这就很 妙 了。代码将极大的简化~哈哈哈
#include <iostream>using namespace std;typedef long long LL;const LL N = 20210420, MOD = 1e9+7;LL a[N], b[N];int main() {LL n = 20210411;// 前i层的正三角形个数for (LL i = 1; i <= n; i ++ ) a[i] += (a[i - 1] + (i * (i + 1) / 2)) % MOD;// 不分奇偶,直接运用等差数列求和公式计算,b[i]为前i层的倒三角个数 for (LL i = 1; i <= n; i ++ ) {if (i & 1) b[i] = ((i + 1) / 2) * (0 + i - 1) / 2 % MOD;else b[i] = ((i + 1) / 2) * (1 + i - 1) / 2 % MOD;b[i] =(b[i] + b[i - 1]) % MOD;}cout << (a[n] + b[n]) % MOD << endl;return 0;
}

[找规律] 三角形个数(牛客+找规律+思维+代码优化)相关推荐

  1. 1090 Highest Price in Supply Chain (25 分)(模拟建树,找树的深度)牛客网过,pat没过...

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  2. 牛客 - 建通道(思维)

    题目链接:点击查看 题目大意:给出每个点的权值为v[ i ],现在要求将 n 个点互相连通,以保证代价最小,点 i 和点 j 连接的代价为 lowbit( v[ i ] ^ v[ j ]) 题目分析: ...

  3. (牛客腾讯思维编程题)编码编码分组打印下标题目分析

    本题答案在这点击进入 假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa,aaaa, aaab, aaac, - ...

  4. 牛客 - 树上博弈(思维)

    题目链接:点击查看 题目大意:给出一棵树,现在有两个人在玩一个游戏,两人依次在树上行走,只能走没有人的结点,无法行走的人失败,题目需要我们求出有多少个初始点对,对于先手而言是必胜的情况 题目分析:其实 ...

  5. 牛客 - 捡金币(思维+二维前缀和+构造)

    题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个方格都有一个权值,现在给出q次询问,每次询问的格式是x,y,k,问与点(x,y)的曼哈顿距离不超过k的方格内的所有权值之和 题目分析:首先这个题 ...

  6. 牛客 - 双流机场(思维)

    题目链接:点击查看 题目大意:给出一个n*m的有向图,每一行和每一列的方向都是相同的,现在给出每一行和每一列的方向,问给出的图是不是一个强联通图 题目分析:这个题目之前做过数据很小的版本,当时那个题目 ...

  7. 牛客网(Java)——三角形

    三角形__牛客网 (nowcoder.com)https://www.nowcoder.com/questionTerminal/c67a09062c0f4a5b964eef0945d3dd06题目要 ...

  8. 牛客竞赛每日俩题 - 动态规划1

    目录 DP入门(存储之前状态以简化) DP解决最短路问题 DP入门(存储之前状态以简化) 拆分词句_牛客题霸_牛客网 思路: 方法:动态规划 状态:         子状态:前1 , 2 , 3 , ...

  9. 洛谷or牛客数据结构+算法

    栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...

  10. 牛客小白月赛 G 异或 找规律

    链接:https://www.nowcoder.com/acm/contest/135/G 来源:牛客网 题目描述 从前,Apojacsleam家的水族箱里,养了一群热带鱼. 在这几条热带鱼里,Apo ...

最新文章

  1. CSRF 攻击的应对之道--转
  2. matlab偶极矩电场强度分布图_1.2.10 电介质在外电场下的极化、电极化强度、电极化率...
  3. 如何用python实现自动化_如何使用Python实现自动化水军评论
  4. 国家开放大学2021春1087数学分析专题研究题目
  5. sqlserver垮库查询_Oracle和SQLServer中实现跨库查询
  6. exists的用法 python_Python 办公自动化自动整理文件,一键完成!
  7. 【OO学习】OO第二单元作业总结
  8. 2021年陕西高考成绩单招查询时间,2021年陕西高考录取结果什么时候出来,查询时间一览表...
  9. oracle中lag()函数和lead()函数的用法(图文)
  10. 网工必考的8个dos命令
  11. pandas读取excel带汉字的列头_Pandas读取excel与中文文件名
  12. origin柱状图坐标标签_origin菜鸟求助。如何做横坐标连续(如下图)的柱状图?...
  13. Python模拟用户自动登陆网易126邮箱
  14. python解决经典数学问题-用python解决普通高中数学书A必修三题目(一)
  15. 银行春招:六大行薪资待遇知多少?(下)
  16. 程序员等级图鉴,大牛头发有点少
  17. mt4 虚拟服务器 配置,mt4云服务器配置
  18. 前端项目中如何去除已经不再使用的图片资源
  19. 紧跟百度爱采购:搜狗上线b2b商城“搜狗招商”
  20. 计算机cpu和主板最新发展情况,计算机cpu和主板怎么搭配

热门文章

  1. 支付宝VS微信支付竞品分析
  2. 个人邮箱怎么在微信里登陆?
  3. 20170627——【肿瘤】肿瘤的异质性
  4. 8、OpenCV调整图像对比度和亮度
  5. 支持向量机(一)你确定不看吗
  6. 【多线程】如何保证线程安全
  7. OPNsense用户手册-基于虚拟机和云的安装
  8. Chrome DevTools 中键盘快捷键的参考。
  9. 超声B mode聚焦成像仿真(ultrasound B mode fcous imaging simulation)
  10. ZXing条形码识别框架识别的条型码的种类