本题为3月14日23上半学期集训每日一题中A题的题解
同一平面内有n( \(n \leq 500\) )条直线,已知其中p( \(p \geq 2\) )条直线相交于同一点,则这n条直线最多能将平面分割成多少个不同的区域?
两个整数n( \(n \leq 500\) )和p(如果 \(n\geq 2\) 则 \(2\leq p \leq n\) )。
一个正整数,代表最多分割成的区域数目。
12 5
73
如果你还有少许高中或初中数学知识的记忆的话,应该知道直线分割平面的数量是有规律的.这里我们通过观察法来找找规律.
先来看看相交于同一点的几条直线能把平面分成多少个部分.
当只有一条直线时,平面会被它分成两个部分:

当我们加入第二条边时,当前已有的两个部分再次被一分为二,总共形成4个部分:

显然,再加入第三条边时,它同样也最多也只能将已有部分中的两个一分为二(你怎么画也不可能经过第三个平面区域),使得总数加2
所以如果有p条相交于同一个点的直线,那么平面最多会被划分为 $ p \times 2$ 个部分.这便是相交于同一点的多条直线的规律.
如果直线可以不相交于同一点,可以使得最后划分出来的平面数变多嘛?显然是可以的.
可以证明,一定存在一种画法,使得当前这条直线和前面所有的直线相交(此时一定不会过之前已有的任何一个交点),而这时划分出来的平面数时最多的:

此处这条紫色的直线于原本的两条红色直线相交,可以划分出 $ m + 1 $ (m为原本直线数)个新的部分,也就是 \(n\) (n为当前总共直线数)个部分.这是因为新的直线和原本每条直线相交时,都可以划分出两个新的部分,但是这两个新的部分中的一个,也可以看成是和下一条直线相交划分出来的,所以除了最后一条直线外(因为他没有下一条直线),每一组都会重复计算一个部分,等效于只能多划分出一个部分,所以总共是多 $ m + 1$ 个部分.
所以初始没有边划分时(即一开始平面区域数量是1),n条可以不相交于同一点的边,可以划分出的平面数量为 $ 1 + 2 + 3 + ... + n = \sum_{i = 1}^{n} i = \frac{(1 + n) \times n}{2}$ .如果初始时已有p条边进行了划分,那么继续使用n条可以不相交于同一点的边划分可以增加(因为前面p条边的划分方式可以是交于一点的或其他方式,所以我们只能计算增加的)的部分数为: $ (p + 1) + (p + 2) + ... + (p + n) = \sum_{i = p + 1}^{p + n} i = \frac{(p + 1 + p + n) \times n}{2}$ .这就是可以不相交于同一点的多条直线划分出最大部分数量的规律.
根据上面这两个规律,我们便可以直接通过套用式子,来计算出给定p条相交于同一点的直线和$ n - p $ 条可以相交于同一点的直线时能划分出来的最大平面部分.
时间复杂度: \(O(1)\)
空间复杂度: \(O(1)\)
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n, p;
cin >> n >> p;
n -= p; // 注意n是总直线数,里面同时包含了p,要减掉
i64 res = (p << 1) + ((p + 1 + p + n) * n >> 1); // 直接利用规律求解即可,<<1等同于除以2,>>1等同于乘2,注意优先级,吃不准还是用除法和乘法好
cout << res << "\n";
return 0;
}
"正是我们每天反复做的事情,最终造就了我们,优秀不是一种行为,而是一种习惯" ---亚里士多德
ruby中有这样的东西吗?send(+,1,2)我想让这段代码看起来不那么冗余ifop=="+"returnarg1+arg2elsifop=="-"returnarg1-arg2elsifop=="*"returnarg1*arg2elsifop=="/"returnarg1/arg2 最佳答案 是的,只需像这样使用send(或者更好的是public_send):arg1.public_send(op,arg2)这是可行的,因为Ruby中的大多数运算符(包括+、-、*、/、andmore)只需调用方法。所以1+2与1.+(2)相同
目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标
情况:我正在编写一个程序来求解素数。我需要解决4x^2+y^2=n的问题,其中n是一个已知变量。是的,必须是Ruby。我愿意在这个项目上花费大量时间。我最好自己编写方程式的求解算法,并将其作为该项目的一部分。我真正喜欢的是:如果任何人都可以向我提供指南、网站的链接,或者关于与求解代数方程特别相关的形式算法的构造的歧义消除,或者向我提供似乎你是读者它会帮助我完成任务。请不要建议我使用其他语言。如果您在回答之前接受我真的非常想这样做,我将不胜感激。该项目没有范围或时间限制,也不以营利为目的。这是为了我自己的教育。注意:我并不直接反对为Ruby实现和使用现存的数学库/模块/其他东西,但我更喜
我发现许多Rails应用程序主要针对企业、社交网络类型的Web应用程序。我看到有人将Ruby与一些出色的OOPS语言(如Java和C#)进行了比较,但我确实发现很难获得一些数学密集型应用程序。非常感谢任何知识渊博的输入(指向示例程序的链接等),其中轻松显示了语言的用法,就像快速启动或显示该语言如何用于各种数学问题一样。 最佳答案 不幸的是,Ruby并没有在数学和科学计算领域涉足太多。目前,有一个名为SciRuby的pre-alpha库它试图为Ruby带来更多面向数学的功能。他们正试图构建一个NumPy/SciPy等价物。SciRub
给定一个Ruby数组字符串,其中一些项目在引号中包含逗号:my_string.inspect#=>"\"hey,you\",21"我怎样才能得到一个数组:["hey,you","21"] 最佳答案 Ruby标准CSV库的.parse_csv就是这样做的。require'csv'"\"hey,you\",21".parse_csv#=>["hey,you","21"] 关于ruby-用逗号将字符串分割成数组,除非逗号在引号内,我们在StackOverflow上找到一个类似的问题:
我有这样的字符串'some-dasd\dasd-dasdas\dasdas-dasd-das\dsad'。我需要通过两个不同的符号'\'和'-'将字符串拆分为数组,所以我想得到数组['some','dasd','dasd','dasdas','dasdas','dasd','das','dsad']。最好的方法是什么? 最佳答案 "ome-dasd\dasd-dasdas\dasdas-dasd-das\dsad".split(/\\|-/)应该可以解决问题。 关于ruby-由两个不同的
文章目录网络层数据平面和控制平面两者的概述数据平面控制平面控制平面:传统方法控制平面:SDN方法网络服务模型路由器工作原理通用路由器体系结构输入端口的功能基于目标的转发交换结构内存交换方式总线交换方式纵横式交换方式输出端口的功能何时何处出现缓存队列输入排队输出排队分组调度先进先出优先权排队循环和加权公平排队网络协议:PIv4、寻址、IPv6以及其它IPv4数据报格式IPv4数据报分片IPv4编址IP和子网掩码CIDR分类网络特殊地址分配地址获取一块地址(用于组织的子网内)获取主机地址:动态主机配置协议网络地址转换——NAT一些术语通用转发和SDN匹配动作参考资料网络层从表面上看网络层的作用:将
论文常见数学符号及其含义(科研必备)返回论文和资料目录数学符号在数学领域是非常重要的。在论文中,使用数学符号可以使得论文更加简洁明了,同时也能够准确地描述各种概念和理论。在本篇博客中,我将介绍一些常见的数学符号及其含义(省去特别简单的符号),希望能够帮助读者更好地理解数学论文。高等数学∑i=1nxi\sum_{i=1}^nx_i∑i=1nxi(求和符号):表示将x1,x2,…,xnx_1,x_2,\dots,x_nx1,x2,…,xn中的所有数相加,例如∑i=1nxi\sum_{i=1}^nx_i∑i=1nxi表示将x1,x2,…,xnx_1,x_2,\dots,x_nx1,x
有人知道是否有适合数学/几何运算的好工具吗?我需要一些这样的东西:点积叉积向量之间的角度矩阵表面法线向量计算(加、减...)奇异值分解谢谢,晚礼服 最佳答案 我强烈推荐Ruby/GSLgem。您可能需要引用GSLmanual计算出您需要调用的函数的名称,如果它没有记录在Ruby/GSL文档中的话。 关于ruby数学gem,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/541665
我需要一个正则表达式来用逗号和/或空格分隔字符串,但忽略带连字符的单词——最好的方法是什么?所以,例如——我想要这个……"foobar,zap-foo,baz".split(/[\s]+/)返回["foo","bar","zap-foo","baz"]但是当我这样做时,它包括像这样的逗号......["foo","bar,","zap-foo,","baz"] 最佳答案 "foobar,zap-foo,baz".split(/[\s,]+/) 关于ruby-正则表达式用逗号和空格分割字符