![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数论-计数问题
文章平均质量分 70
lab104_yifan
这个作者很懒,什么都没留下…
展开
-
UVA 11538 - Chess Queen(数论+计数问题)
题目链接:11538 - Chess Queen题意:给一个n*m棋盘,问放两个皇后,使得两个皇后互相能攻击到,有几种放法思路:分横竖,对角线来考虑。横:n * A(m, 2)种竖:m * A(n, 2)种对角线:由于有两条,可以算一条再乘22 * 所有对角线和(A(对角线格数,2))。那么对角线格数为:(1, 2, 3, 4 ... n .n .n .n.n - 1.原创 2014-04-29 12:57:56 · 1158 阅读 · 0 评论 -
UVA 10593 - Kites(DP)
UVA 10593 - Kites题目链接题意:给定一张纸,问能剪出如题目所述的风筝有几种方法思路:正方形和菱形分开考虑,不过dp[i][j]都表示以(i,j)为右下角,所构成图形的边长,那么状态转移为往之前两个方向的最小边长。但是有一些特殊情况要判断,这个在纸上画一画就很清楚了代码:#include #include #include using namespa原创 2014-06-03 19:58:07 · 1307 阅读 · 0 评论 -
UVA 12034 - Race(递推)
UVA 12034 - Race题目链接题意:给定n匹马,要求出可能的排名情况(可能并列)思路:递推,dp[i][j]表示i匹马的时候有j种不同名次,那么dp[i][j]可以由dp[i - 1][j - 1]插入j个不同位置得来,或者由dp[i - 1][j]放入已有j的名次得来,得到递推式dp[i][j] = j * (dp[i - 1][j - 1] + dp[i - 1]原创 2014-05-23 19:47:34 · 1332 阅读 · 0 评论 -
UVA 10843 - Anne's game(Cayley定理)
UVA 10843 - Anne's game题目链接题意:题意说得挺绕的,其实本质上就是求n个点,可以接连出多少种不同的生成树思路:这是Caylay定理,网上能找到证明,结果为nn−2,然后利用快速幂去求解。代码:#include #include const int long long MOD = 2000000011;int t;long long n;原创 2014-05-23 21:59:41 · 1183 阅读 · 0 评论 -
UVA 10574 - Counting Rectangles(枚举+计数)
10574 - Counting Rectangles题目链接题意:给定一些点,求能够成几个矩形思路:先把点按x排序,再按y排序,然后用O(n^2)的方法找出每条垂直x轴的边,保存这些边两点的y坐标y1, y2。之后把这些边按y1排序,再按y2排序,用O(n)的方法找出有几个连续的y1, y2都相等,那么这些边两两是能构成矩形的,为C2cnt种,然后累加起来就是答案代码:原创 2014-05-24 00:00:46 · 1389 阅读 · 0 评论 -
HDU 4832(DP+计数问题)
HDU 4832 Chess思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行,然后相乘累加起来就是答案代码:#include #include #include using namespace std;typedef long long ll;const ll MOD = 9999991;const int N = 1005;int t, n, m,原创 2014-05-25 19:02:46 · 1027 阅读 · 0 评论 -
UVA 12508 - Triangles in the Grid(计数问题)
12508 - Triangles in the Grid题目链接题意:给定一个n∗m格子的矩阵,然后给定A,B,问能找到几个面积在A到B之间的三角形。思路:枚举每一个子矩阵,然后求[0,A]的个数减去[0,B]的个数就是答案,然后对于每个子矩阵个数很好求为(n−r+1)∗(m−c+1)。关键在于怎么求每个子矩阵的符合个数。想了好久,参考别人题解才想出来,分3种情况原创 2014-05-27 01:01:34 · 1681 阅读 · 0 评论 -
UVA 11123 - Counting Trapizoid(计数问题+容斥)
UVA 11123 - Counting Trapizoid题目链接题意:给定一些点,不重复,求出一共有几个梯形思路:先把所有两点组成直线求出来,然后排序,斜率相同的C2n个,然后再扣除掉重叠的直线情况和长度相等情况(这样为平行四边形或矩形),由于扣除的时候会重复扣掉重叠和相等,所以在加回来,这是容斥原理。代码:#include #include #in原创 2014-07-01 00:22:17 · 1249 阅读 · 0 评论 -
UVA 1436 - Counting heaps(计数问题)
UVA 1436 - Counting heaps题目链接题意:给定一个树的结构,放1-n数字进去,父亲结点值必须小于子节点,问情况有几种.思路:f[u]表示以u为子树的情况,那么子树情况为f(v1), f(v2), f(v3)... f(vn).去组成子树相当于从中选s(v1), s(v2), s(v3) ... s(vn).根据组合数学,情况为f(v1)f(v2)原创 2014-07-01 19:04:56 · 1242 阅读 · 0 评论 -
UVA 11885 - Number of Battlefields(斐波那契)
11885 - Number of Battlefields题意:给周长,求能围成的战场数目,不包括矩形。思路:具体的递推没递推出来,但是看了网上一个规律,如果包括矩形的答案应该是斐波那契数列(但是奇数情况为0),然后减去矩形数目就是答案,矩形数目为n / 2 - 1,用矩阵快速幂就能求了。具体的递推过程哪位大神能指点下。。。代码:#includ原创 2014-07-01 23:24:51 · 1591 阅读 · 0 评论 -
UVA 1425 - Metal(递推)
UVA 1425 - Metal题目链接题意:给定一个金属板,上面有一些点,现在有一台切割机,要切割出单调四边形,由所有点组成,问有多少种情况。思路:递推,设dp[i][j],i为上面点,j为下面点,现在多添加一个点k进来,那么原来的dp[i][j]必然要有一维为k - 1,枚举另外一维就是所有情况。然后再添加点进来的过程中还要考虑能不能加进来,写一个判断函数,把连接线之间原创 2014-07-02 16:52:11 · 1118 阅读 · 0 评论 -
UVA 1510 Neon Sign(计数)
UVA 1510题目链接题意:给定一些点两两相连,已知每两点连接是红色还是蓝色,问同色三角形有多少个思路:由于不同色三角形也有两边同色,直接考虑不好考虑,反过来考虑,先找出不同色三角形,对于每个点而言,找一个红边和一个蓝边就能构成不同色三角形,那么每个三角形被选了3次,其中一次是同色的不用考虑,所以最后答案除以2,然后在用总情况数C(n, 3) - sum即可代码:原创 2014-07-27 15:17:08 · 1017 阅读 · 0 评论 -
UVA 10458 - Cricket Ranking(容斥原理)
UVA 10458 - Cricket Ranking题目链接题意:给定k个区间,要求用这些数字范围去组合成n,问有几种组合方式思路:容斥原理,容斥是这样做:已知n个组成s,不限值个数的话,用隔板法求出情况为C(s + n - 1, n - 1),但是这部分包含了超过了,那么就利用二进制枚举出哪些是超过的,实现把s减去f(i) + 1这样就保证这个位置是超过的,减去这部分后原创 2014-07-27 21:42:01 · 988 阅读 · 0 评论 -
HDU 4908 BestCoder Sequence(组合数学)
HDU 4908 BestCoder Sequence题目链接题意:给定一个序列,1-n的数字,选定一个作为中位数m,要求有多少连续子序列满足中位数是m思路:组合数学,记录下m左边和右边一共有多少种情况大于m的数字和小于n数组的差,然后等于左边乘右边所有的和,然后最后记得加上左右两边差为0的情况。当时也是比较逗,还用树状数组去搞了,其实完全没必要代码:原创 2014-08-03 23:48:11 · 1173 阅读 · 0 评论 -
HDU 4909 String(组合数学)
HDU 4909 String题目链接题意:给定一个字符串全是小写字符,可能有一个位置为?,问号可以替代任何字符,也可以删掉,问有多少连续字串满足所有字母是偶数个思路:组合数学,计算所有前最串的各个字母的奇偶状态,用一个01串表示,然后记录下个数,对于每个相同的状态,任选两个就能得到一个子序列,答案为所有C(num, 2)的和。但是这个问题多了一个?的情况,但是没关原创 2014-08-03 23:52:28 · 1905 阅读 · 7 评论 -
UVA 1264 - Binary Search Tree(BST+计数)
UVA 1264 - Binary Search Tree题目链接题意:给定一个序列,插入二叉排序树,问有多少中序列插入后和这个树是相同的(包括原序列)思路:先建树,然后dfs一遍,对于一个子树而言,只要保证左边和右边顺序对就可以了,所以种数为C(左右结点总数,左结点),然后根据乘法原理乘上左右子树的情况即可代码:#include #include t原创 2014-08-25 11:30:00 · 1483 阅读 · 0 评论 -
HDU 4945 2048(DP)
HDU 4945 2048题目链接题意:给定一个序列,求有多少个子序列能合成2048思路:把2,4,8..2048这些数字拿出来考虑就可以了,其他数字无论如何都不能参与组成,那么在这些数字基础上,dp[i][j]表示到第i个数字,和为j的情况数,然后对于每个数枚举取多少个,就可以利用组合数取进行状态转移,这里有一个剪枝,就是如果加超过2048了,那么后面数字的组合数的和全部原创 2014-08-15 11:36:13 · 1763 阅读 · 5 评论 -
Codechef Sam and Sequences(单调队列)
题目链接:http://www.codechef.com/problems/PRYS03/这题只要考虑每个数字,最左和最右分别能延伸到的位置,然后就能计算出每个数字需要计算的次数,由于数字可能重复,所以对于左边维护到不大于的第一个数字位置,右边维护到小于的第一个数字位置,然后维护好后,在扫一遍计算总和即可代码:#include #include #include using na原创 2015-03-03 19:28:10 · 620 阅读 · 0 评论 -
UVA 10844 - Bloques (第二类斯特灵数)
UVA 10844 - Bloques题目链接题意:给定n个数字,问这n个数字能分成子集分成有几种分法思路:一开始先想了个状态,dp[i][j]表示放i个数字,分成j个集合的方案,那么转移为,从dp[i - 1][j - 1]在多一个集合,和从dp[i - 1][j]有j个位置放,那么转移方程为dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]原创 2014-06-01 19:51:49 · 1246 阅读 · 0 评论 -
UVA 10712 - Count the Numbers (数位DP)
UVA 10712 - Count the Numbers题目链接题意:求区间[A,B]数字中,子串包含N的数字有多少个思路:数位DP,写了个记忆化乱搞搞过了,dp[i][j][2][2][2],分别表示i位的时候,末尾为j的情况,后面3维用来处理小于的情况,已经出现过子串的情况,前导0的情况,然后注意特判一下数字0的情况,因为一开始要分解数字,而0是不能分解的。代原创 2014-05-20 16:53:21 · 1436 阅读 · 0 评论 -
UVA 10237 - Bishops(递推)
UVA 10237 - Bishops题目链接题意:问一个n * n棋盘能放k个主教(攻击斜线)的方案数。思路:递推,首先考虑一个问题,在一个n∗n棋盘上,放k个车的方案数。那么设dp[i][j]为i行用了j个车的方案数,由于每行只能放一个车,那么考虑i行放不放车,如果放车,那么能放的位置有n−(j−1)个位置,为dp[i−1][j−1]∗(n−(j−1))。如果不放那原创 2014-05-19 23:03:19 · 1638 阅读 · 1 评论 -
UVA 11401 - Triangle Counting(数论+计数问题)
题目链接:11401 - Triangle Counting题意:有1,2,3....n的边,求最多能组成的三角形个数。思路:利用三角形不等式,设最大边为x,那么y + z > x 得 x - y 然后y取取值,可以从1取到x - 1,y为n时候,有n - 1个解,那么总和为0 + 1 + 2 +...+ (x - 2) = (x - 1) * ( x- 2) / 2;然后扣除掉重原创 2014-04-29 22:57:42 · 1716 阅读 · 0 评论 -
UVA 10253 - Series-Parallel Networks(数论+计数问题+递推)
题目链接:10253 - Series-Parallel Networks白书的例题。这题也是需要把问题进行转化,一个并联可以分为几个串联,然后串联可以分成边。如此一来,最后叶子结点种数会是n,问题转化为去分配叶子结点,使得总和为n。书上有两种方法,一种直接去递归,利用组合数学的方式去计算答案。一种是推出递推式:设dp[i][j]为一共j个叶子结点的树,子树的叶子最多的为i原创 2014-05-10 14:02:23 · 997 阅读 · 0 评论 -
UVA 1362 - Exploring Pyramids(计数问题+区间DP)
题目链接:1362 - Exploring Pyramids白书上的例题,思路是对于每个结点,往后遍历分为左右两边子树来考虑,左边的子树为去掉根节点剩下的子树,而右边是要算上根节点的,这样就不会有重复的情况出现,然后根据乘法原理,左右两边情况相乘为总情况数,然后计算这些总和。 f[i][j]表示[i,j]结点的情况种数,那么 f[i][j] = sum{f[i + 1][k - 1] *原创 2014-05-10 12:59:49 · 1729 阅读 · 0 评论 -
UVA 11361 - Investigating Div-Sum Property(数位DP)
题目链接:11361 - Investigating Div-Sum Property白书上的例题,不过没有代码,正好前几天写了一题数位DP的题目,这题也就相对轻松了。dp[i][x][y]表示加到第i位,数字 % k,数位和 % k的组合情况数,那么现在要添加一个0 - 9的数字上去状态转移为dp[i + 1][(x * 10 + num) % k][(y + num) % k],计原创 2014-05-10 13:04:09 · 1949 阅读 · 1 评论 -
【数论】计数问题的几种基本方法
一、计数原理加法原理:n个方法,每个方法有Pi种方案,那么一共方案数为P1 + P2 + P3... + Pn乘法原理:一件事情有n个步骤,每个步骤需要pi种方案,那么一共有P1 * P2 * P3 * ... * Pn种方案。容斥原理:集合A,B,C。|A U B U C| = |A| + |B| + |C| - |AB| - |AC| - |BC| + |ABC|。依次类推。基原创 2014-05-10 14:20:55 · 4632 阅读 · 2 评论 -
UVA 10883 - Supermean(组合数学+数值优化)
题目链接:10883 - Supermean题意:求超级平均数,就是相邻两个算一个平均数,直到剩下一个数,求数值。思路:画图很容易推断出公式。就拿最后一组样例来说1 2 3 4 5 1.5 2.5 3.5 4.5 2 3 4 2.5 3.5原创 2014-05-10 20:01:28 · 1266 阅读 · 0 评论 -
UVA 11645 - Bits(数论+计数问题)
题目链接:11645 - Bits题意:给定一个数字n,要求0-n的二进制形式下,连续11的个数。思路:和 UVA 11038 这题类似,枚举中间,然后处理两边的情况。不过本题最大的答案会超过longlong,要用高精度,不过借鉴http://www.cnblogs.com/TO-Asia/p/3214706.html这个人的方法,直接用两个数字来保存一个数字,这样能保存到2个lo原创 2014-05-11 00:04:08 · 1854 阅读 · 0 评论 -
UVA 11038 - How Many O's?(计数问题)
题目链接:11038 - How Many O's?题意:求[a.b]之间,0出现的次数。思路:一开始一直往数位DP上去想,结果发现挺复杂的。。把问题先转化为求0 - num的个数,在用到b的个数减去到a的个数其实只要利用计数的乘法和加法原理,把数字对应的每一位的分成左右两边,利用乘法原理求总数,在用加法原理把所有的总数加起来就是总情况数。那么讨论一下分成两边的情况。举个例子比原创 2014-05-10 19:36:18 · 1021 阅读 · 0 评论 -
UVA 1073 - Glenbow Museum(数论+计数问题+递推)
题目链接:1073 - Glenbow Museum白书上的例题,需要一定的推理。首先要把问题转化,推理出n个点,R的个数为(n + 4) / 2, O的个数为(n - 4) / 2个,因为首先四个角必须为R,然后在中间添加O点,每有一个O点就要多一个R点,所以最后R点比O点多4。然后问题就转化为给定n个R点和m个O点,求出有多少个序列,要求O点不连续,并且R的连续个数不能超过4,的序原创 2014-05-10 13:36:58 · 1870 阅读 · 0 评论 -
UVA 10497 - Sweet Child Makes Trouble(DP+高精度)
题目链接:10497 - Sweet Child Makes Trouble题意:n个物品,原来物品属于一个地方,现在要把物品重新放回去,问能放几种使得每个物品都与原来位置不同思路:递推,一开始随便搞了个二维状态,dp[i][j]表示i个物品,有j个位置不同,那么dp[n][n]就是答案,递推式为:dp[i][j] = 1 (j == 0)dp[i][j] = (j - 1) *原创 2014-05-11 13:27:36 · 1435 阅读 · 0 评论 -
HDU 3629 Convex(数论+计数+几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3629题意:给定n个点,求能构成几个凸四边形解法:详见blog.sina.com.cn/s/blog_64675f540100ksug.html,利用到了组合数学计数的方法,高效算法two pointer,复杂度O(n^2)代码:#include #include #include原创 2014-05-18 13:53:56 · 1583 阅读 · 0 评论 -
UVA 11481 - Arrange the Numbers(组合数学)
题目链接:11481 - Arrange the Numbers题意:序列1-n,进行重排,问最后前m个中有k个仍然位置不变的情况数思路:之前写过UVA 580, n个数重排,要求每个位置都不同的情况的题目,递推式为dp[i] = (i - 1) * (dp[i - 1] + dp[i - 2])利用这个,这题只要:k个位置C(m, k) * sum(C[n - m][i] (后面原创 2014-05-18 21:51:31 · 1499 阅读 · 0 评论 -
UVA 1393 - Highways (容斥原理计数)
题目链接:1393 - Highways题意:给定一个n * m的点阵,问两两相连后,能组成多少条至少穿过两个点的直线,并且不是水平或垂直的思路:找过两点的线段,由于是整数坐标,只要他的斜率不是整数,即x / y不是整数就能满足答案,然后先记录下这所有的位置,然后利用容斥原理求出对应每个点可以连出多少条这样的线段,最后去求和,求和的时候要注意,由于有一些是重复计算了,比如1 1 和 2 2原创 2014-05-18 09:23:43 · 2184 阅读 · 0 评论 -
UVA 12075 - Counting Triangles(容斥原理计数)
题目链接:12075 - Counting Triangles题意:求n * m矩形内,最多能组成几个三角形这题和UVA 1393类似,把总情况扣去三点共线情况,那么问题转化为求三点共线的情况,对于两点,求他们的gcd - 1,得到的就是他们之间有多少个点,那么情况数就可以求了,然后还是利用容斥原理去计数,然后累加出答案代码:#include #include #include原创 2014-05-18 09:30:30 · 1640 阅读 · 0 评论 -
UVA 11529 - Strange Tax Calculation(计数问题)
题目链接:11529 - Strange Tax Calculation题意:平面上n个建筑物,3个建筑物可以组成一个三角形,计算平均每个三角形内有多少个点思路:问题等价于,求凹四边形的占所有四边形的比例,用O(n^2)的算法,跟 HDU 3629 Convex这题是一个道理代码:#include #include #include #include using原创 2014-05-18 14:14:54 · 1015 阅读 · 0 评论 -
UVA 12123 - Magnetic Train Tracks(计数问题)
题目链接:12123 - Magnetic Train Tracks题意:给定n个点,求有几个锐角三角形。思路:和UVA 11529是同类的题,枚举一个做原点,然后剩下点根据这个原点进行极角排序,然后利用two pointer去遍历一遍,找出角度小于90度的锐角,然后扣掉这些得到钝角三角形的个数,然后在用总情况去扣掉钝角就是锐角或直角代码:#include #include #原创 2014-05-18 21:44:56 · 1380 阅读 · 4 评论 -
UVA 10312 - Expression Bracketing(数论+Catalan数)
题目链接:10312 - Expression Bracketing题意:有n个x,要求分括号,判断非二叉表达式的个数。思路:二叉表达式的计算方法就等于是Catalan数的,那么只要计算出总数,用总数减去二叉表达式个数,得到的就是非二叉表达式的个数。那么计算方法是什么呢。看题目中的图,对于n = 4的情况,可以分为这几种情况来讨论:四个1, 一个2两个1,一个3一个1,一个4,对应原创 2014-05-13 22:19:02 · 1195 阅读 · 0 评论 -
ZOJ 3871 Convex Hull(计数)
一个n边形的面积,可以三角剖分成n 个每个边和原点构成的三角形的有向面积这样每条边等于一个有向面积,那么问题转化成只要求每条边能作为几个凸包的边那么枚举一点O,这样对于任意一点X会有一条OX的边,而这条边构成凸包的数量,显然就是只能在和他夹角180度以内的边以内找,也就是有多少个点,就是2^num - 1(因为至少要有一个点)于是进行极角排序,双指针扫一遍就能得到所有答案代码:原创 2015-04-29 12:47:27 · 1809 阅读 · 0 评论