![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
大白书-第2章-数学基础
文章平均质量分 67
冷月残星
这个作者很懒,什么都没留下…
展开
-
组合数学(象棋中的皇后,uva 11538)
先统计同一行的所有情况,再统计同一列的所有情况,然后再统计所有对角线的所有情况。不妨设n同一行:一共有n行,对于每一行,有A(m,2)种情况,一共有n*A(m,2)。同一列:一共有m列,对于每一列,有A(n,2)种情况,一共有原创 2016-11-03 10:23:18 · 316 阅读 · 0 评论 -
概率(和朋友会面,UVA 11722)
横坐标t表示你的时间,纵坐标s表示你朋友的时间。因为你的火车会在[t1,t2]时间段内等概率的到达,你朋友的火车会在[s1,s2]时间段内等待率的到达。所以由t=t1,t=t2,s=s1,s=s2四条直线围成的矩形就是概率空间,设这个区域为A。点(t,s)在矩形内表示你和你朋友分别在t时刻与s时刻刚好到达这座城市。矩形内每个点发生的概率都相等。由于火车到达后一定会停留w分钟,所以当且仅当你原创 2016-11-22 11:27:38 · 442 阅读 · 0 评论 -
置换,循环,模拟(像素混合,LA 3510)
大模拟+置换理论就是按要求把每个操作都实现一遍,然后常规的找循环节,然后答案显然是所有循环节的最小公倍数。感觉自己写长代码,大模拟的能力很弱,主要是因为自己找小错误能力太弱(其实啥都弱),代码一长,更多的小细节会遗漏和出错,而自己却写得很爽并且浑然不知,然后连样例都过不了,还以为是思路或者方法出了问题,反复测试都找不到问题。解决办法:大模拟这种东西是最考验踏实程度的题目原创 2016-12-06 12:24:42 · 332 阅读 · 0 评论 -
矩阵快速幂(递推关系,UVA 10870)
很基础的矩阵快速幂,但自己写的题还不够多,所以写代码的时候会磕磕巴巴,写完后有一些小错误还得再debug。#includeusing namespace std;typedef long long ll;ll D,N,M;struct jz{ ll n,m; ll A[20][20]; void I(ll x) { mem原创 2016-12-06 14:15:35 · 274 阅读 · 0 评论 -
矩阵快速幂(细胞自动机,LA 3704)
朴素的矩阵乘法O(n^3)会超时。但是因为这个矩阵是循环矩阵,根据循环矩阵的性质:循环矩阵*循环矩阵=循环矩阵所以只用算出第一行,然后根据循环矩阵的性质就可以递推出下一行,进而得到整个循环矩阵。时间复杂度降为O(n^2)。如果遇到一些模板题却超时就要好好想一想这道题跟模板题到底哪里不一样了,进而才能发现优化的方法。很多东西都是靠想出来的。代码#inc原创 2016-12-06 15:57:15 · 328 阅读 · 0 评论 -
高斯-约当消元法(随机程序,UVA 10828)
就是有一类题目:就是给你一个图,和一个起始点(可以很抽象,比如UVA 11762需要你自己建模。也可以很具体,比如就是一个网格)然后每个节点都有一定概率转移到另一些节点。具体解法就是:如果是有向无环图就用动态规划或者记忆化搜索。否则就是高斯消元。本题就是高斯消元。然后如果使用高斯-约当消元法就可以省去回代的过程。大白书上的代码是用double类型的,原创 2016-12-06 19:44:57 · 852 阅读 · 0 评论 -
高斯消元(Square,UVA 11542)
原来这就是传说中的原题= =。自己写的时候行列搞反了,一直WA。事实上每一列是同一个质数,每一行是同一个数。之所以没有判断是否存在矛盾方程是因为等号右边全是0,所以至少有一个零解,所以没有矛盾方程,所以不用判断。解题思路:就是500内一共只有95个质数,而n又小于等于100。所以我们可以考虑把每个数都拆成多个质数的乘积(即所谓的唯一分解),然后根据条件(最多原创 2016-12-07 11:19:44 · 282 阅读 · 0 评论 -
概率DP,记忆化搜索(Expect the Expected,uva 11427)
很容易发现每天晚上是独立的,只要求出了一天晚上的胜率Q,那么答案就是求一个连胜几天的数学期望Ex=∑i*(1-Q)*Q^(i-1)=1/(1-Q),期望就是一个收敛数列的和。其实就是差比数列的和啦,可以推出公式然后O(1)算出。自己算胜率的时候算得很迷,一是看成获胜比例大于一半才停止,二是一直想着算胜率而不是败率,算了半天也没算出来。自己真的很不踏实,很浮躁,很瞎搞,做事应该稳原创 2016-11-24 19:06:36 · 353 阅读 · 0 评论 -
随机转移(Race to 1,UVA 11762)
就是状态转移是有概率的,但要求的是期望,那就用全期望公式写出状态转移方程就好了,这个状态机有些有趣,就是一定概率变成自己,所以写出出全期望公式后变形一下就是状态转移方程,然后正常的记忆化搜索就好了。画出状态转移图有助于写出正确的公式。在动态规划里状态转移方程就是一切,写错一点就什么都没了。画图是个不错的辅助技巧。写出公式后一定要化简,这甚至可能是最关键的一步。代码#include原创 2016-11-24 22:26:17 · 324 阅读 · 0 评论 -
等价类计数(Arif in Dhaka (First Love Part 2),UVA 10294)
就是定义两种等价类,然后问你分别有多少个等价类。然后要用到Burnside引理。就是对于一个置换f,若一个着色方案s经过置换后不变,称s为f的不动点。将f的不动点数目记为C(f),则可以证明等价类数目为所有C(f)的平均值。那么如何计算不动点数目C(f)呢?一般的,如果置换f分解成m(f)个循环的乘积,那么每个循环内所有各自的颜色必须相同,假设涂k种颜色,则有C(f原创 2016-11-25 00:30:00 · 707 阅读 · 0 评论 -
置换(Leonardo's Notebook,LA 3641)
关于置换群的理论一无所知= =,数学真的好重要。讲一下置换乘法吧,就只是自己的理解,看了好久才想明白,也不知道对不对。首先对于置换(1 2 3 4)(3 4 1 2)我们可以拆成循环相乘(1 3)(2 4)因为对于上述置换,1->3->1是一个循环,2->4->2是一个循环。相乘就是每个循环都依次执行一次置换。注意,在这里这两个循环都不相交。原创 2016-11-25 11:31:08 · 2204 阅读 · 0 评论 -
二分法(解方程,UVA 10341)
观察后发现函数在[0,1]是单调减函数,如果f(0)>=0且f(1)原创 2016-12-07 17:49:35 · 288 阅读 · 0 评论 -
三分法(误差曲线,LA 5009)
一开始没想清楚。。。以为要分段然后三分。。。然后果断超时了。。。其实由于函数是取所有凹函数的最大值,所以复合起来也是凹函数,直接在[0,1000]上三分就好了。。。至于三分多少次的问题,有两种解决办法,一是设eps,一旦精度足够就果断结束。二是固定三分次数,这个次数可以根据时间复杂度算出一个可行的最大值,比如这道题,T=100,n=10000,时限3000ms,所以固定三分原创 2016-12-07 20:30:13 · 376 阅读 · 0 评论 -
置换,循环,递推(排列统计,UVA 11077)
把排列看成置换,再把置换写成循环乘积。观察循环,设某个循环中有c个元素,那么这些元素在排列中一共要交换c-1次才能到对应的位子,设有x个循环,那么需要交换的次数便是c1-1+c2-1+...+cx-1=n-x,这是一个跟元素个数以及循环个数有关的量。定义状态f(i,j),表示变成(1,2,..,i)需要j次交换的排列个数。那么容易得到状态转移方程f(i,j)=f(i-1,j)+f(原创 2016-11-25 16:49:18 · 535 阅读 · 0 评论 -
概率DP,递推(麻球繁殖,UVA 11021)
能想到是概率DP,但是定义状态dp[i][j]第i天剩j个麻球。然后麻球数量可能会繁殖到非常多,状态太多数组开不下,然后就不会了。感觉自己总是轻易就放弃了,还是应该再思考一下,一般遇到这种想到DP但是数组开不下或者转移方程找不到或者转移方程太复杂的时候就应该想想可不可以优化,而不是直接就放弃。开不下就把状态定义得简单一些,看看是不是有哪些维是没必要记录,而只需要特别处理一下就好,或者重原创 2016-11-22 09:48:21 · 391 阅读 · 0 评论 -
SG函数(Treblecross游戏,UVA 10561)
总想着就是一个游戏,然后就想状态压缩DP,或者说是递推,可是长度为200,弄不了呀,然后就不会了。事实上,要学会把一个游戏拆成多个单独的游戏,算出SG函数,然后求一下nim和。关于思路。就是说一个聪明的游戏者肯定不会把X放X旁边或者放X的旁边的旁边,因为一放就输(除非直接赢了)。这游戏就变成了谁先没格子放的问题。X,X旁边,X旁边的旁边的格子把棋盘分成了多个部分,每原创 2016-11-22 00:56:24 · 408 阅读 · 0 评论 -
数学,容斥原理(拉拉队,uva 11806)
想到了要用容斥原理,但事实上我根本就没有从数学上理解容斥原理是干什么的。只知道加起来,重复的再减过去,重复的再加起来。遇到一些抽象的情况便傻眼了,只好乱搞然后一脸懵逼,然后WA。再读一遍大白书P103上的容斥原理。容斥原理有一个变种:假设全集为S,另有3个集合A,B,C,不属于A,B,C任何一个集合,但属于全集S的元素一共有多少个呢?和前面的方法类似,我们先扣除A,B,C,然后把|原创 2016-11-03 20:09:28 · 337 阅读 · 0 评论 -
动态规划,递推,高精度(Matches,uva 11375)
第二次用JAVA交题。还是写得一脸懵逼。给点链接JAVA高精度基础http://blog.csdn.net/l04205613/article/details/6873991第一次交JAVAhttp://blog.csdn.net/xl2015190026/article/details/52887202动态规划用刷表法,缺点是要先全部置0,优点是转移简单,原创 2016-11-03 21:37:32 · 364 阅读 · 0 评论 -
动态规划,递推,多段图(Ingenuous Cubrency,uva 11137)
多段图问题是一种特殊的动态规划。状态转移像是一种跳跃。动态规划的值是路径数。对于每一个状态,遍历所有可以转移的下一个状态,然后把自己的路径数加给它。或者对于每一个状态,遍历所有可以转移给他的状态,然后把它的路径数加给自己。题目往往会问有多少个,有多少种。一般来讲有两种解法:第一种是先枚举状态,再枚举转移,这时所求的路径数是转移的排列。上一题便是如此。第二种先枚举转移原创 2016-11-03 23:29:08 · 702 阅读 · 0 评论 -
数学,乘法逆元(Stand in a Line,uva 11174)
一开始就暴力的算啊,每个节点乘以一个阶乘再除以k个阶乘,然后发现除法不满足求余定理,就用什么鬼唯一分解定理啊,然后就TLE啊。。。事实上所谓数学题就是要你求出公式然后化简公式的,未经化简的公式简直太糟糕了,化简后运算量会大大减少的。得到公式后还是发现除法不满足求余定理,然后不会,事实上解决这个问题需要用到乘法逆元。从一开始学习乘法逆元就没弄懂他是干啥的,只知道要用什么扩展欧几里得算法,原创 2016-11-04 10:05:14 · 434 阅读 · 0 评论 -
区间DP(多叉树的遍历,LA 3516)
放在数学专题里,想不出数学的方法,但觉得可以用区间DP求解。如果是二叉树就很好解决,只用枚举一下中间的回归点就好,复杂度O(n^3)。但是偏偏求得是多叉树,自己只能想到位向量枚举集合或者dfs的方法。可以剪枝但无法避免最差情况,然后就不会了。最近在紫书和大白书上做了很多动态规划的题目,有了很多感触,看了这道题的解法后又有了新的理解。就是说动态规划不一定只能从旧状态转移到新状态,也可原创 2016-11-07 21:45:43 · 731 阅读 · 0 评论 -
数位DP(数字和与倍数,uva 11361)
这道题拖了一整天,WA了无数发,感觉自己数位DP特别弱,其实可能就是因为自己数学比较弱,或者说在推导和代入繁杂的公式以及边界很粗糙的讨论上太不够严谨了,总是觉得大概对就对了,这在数学题上是非常致命的缺点,因为公式错一点点就直接WA,讨论一遗漏也直接WA。然而这道题真蛋疼,明明公式错了,然而样例甚至自己生成的大部分数据都能过。。。数位DP还需要大量的练习,太不够熟练了。然后是原创 2016-11-09 11:49:01 · 1580 阅读 · 0 评论 -
动态规划(串并联网络,uva 10253)
#include#define maxn 35using namespace std;typedef long long ll;ll dp[maxn][maxn];ll f[maxn];ll C(ll m,ll n){ double ret=1; for(ll i=0;i<n;i++) ret*=m-i; for(ll i=1;i<=n;i原创 2016-11-16 22:24:01 · 442 阅读 · 0 评论 -
大步小步算法(网格涂色,uva 11916)
算法详解http://blog.miskcoo.com/2015/05/discrete-logarithm-problem参考代码http://blog.csdn.net/u011345136/article/details/38796399M至少应当等于不能涂色的格子的行编号的最大值。。。好咯。。。就算这样也还是不会做,还有太多知识点不知道了。主要问转载 2016-11-21 16:32:21 · 803 阅读 · 0 评论 -
数学题(总是整数,LA 4119)
判断一个关于n的多项式是否在n取所有正整数时都是D的倍数。如关于n的多项式2n+2在n取所有正整数时都是2的倍数,而不都是3的倍数。是否都是D的倍数,最好的方法就是证明多项式是一个等差数列,且首相和公差都是D的倍数即可。设k为多项式的次数。当k=0时,多项式是一个常数,因此只需要判断P(1)。当k=1时,有多项式P(n)=an+b。原创 2016-11-17 11:50:28 · 488 阅读 · 0 评论 -
欧拉函数,筛法(最大公约数之和——极限版II,UVA 11426)
看到数据范围,大概就知道是O(nlogn)了。然后一开始尝试用筛法来做,有一些细节没办法处理好,想要处理好至少要O(n^2logn),还不如O(n^2)。注意啊我的方法是错的,只是讲一下,别看。我的方法就是ans[j]表示∑gcd(i,j),i然后s[i]=s[i-1]+ans[i]。s[n]就是答案。怎么求ans[j]呢。就是用筛法。因为 an原创 2016-11-17 20:18:57 · 756 阅读 · 0 评论 -
中国剩余定理,枚举(数论难题,UVA 11754)
就是给你C个同余方程组,每个方程组有Kc个模方程。一个同余方程组的解是其中每个模方程的解的并集,所有同余方程组的解是单个同余方程组的解的交集。求最小的S个解。无非就是枚举方程的组合,然后跑中国剩余定理或者从小到大枚举x判断是否可行。但是当时觉得都很慢。没有发现互补的一面。然后就想用一些数论的方法把一个方程组变成单个方程,改编一下china函数的算法,然后发现没办法做到,原创 2016-11-18 12:17:29 · 372 阅读 · 0 评论 -
排列组合,递推,记忆化搜索(葛伦堡博物馆,LA 4123)
就是容易发现一共有numo=(n-4)/2个O,一共有numr=(n+4)/2个R。然后不能有两个O连在一起,头和尾同时为O也不行。就是插空法啦。现在C(numr+1,numo)-C(numr-1,numo-2)。意思是numr+1个空里选numo个减去numr-1个空里选numo-2个。即随便插空减去头和尾都是O的情况。由于(numr-numo)书上用的是递推,记忆化搜索。虽然麻烦但原创 2016-11-15 09:45:37 · 609 阅读 · 0 评论 -
SG函数,找规律(石子游戏,LA 5059)
数据范围那么大,用SG函数递推肯定不行,无论空间还是时间都是不允许,只能先用SG函数跑一些小数据,然后打表找规律。找规律的话就是各种观察啊。这次就是看隔几个出现一次,然后就找到规律了。代码#includeusing namespace std;typedef long long ll;ll SG(ll x){ return x&1?SG(x>>1):x;}i原创 2016-11-21 19:08:45 · 369 阅读 · 0 评论 -
自适应辛普森法,曲线积分,二分法(桥上的绳索,LA 3485)
就是本题让我又翻出了半年未动的数学分析讲义,把曲线积分以及不定积分又复习了一遍。如果已知函数值想求自变量而反函数又难以解出的话,可以利用函数的一些性质,比如单调性,然后二分自变量求解。如果是单峰函数的话,可以先三分求出极值点,然后转化成两个单调函数。其他就是纯数学问题了。代码#includeusing namespace std;const doub原创 2016-12-08 15:48:12 · 751 阅读 · 0 评论