今天主要是学习了一下数学的相关知识,首先是补充了昨天没学好的一块,解线性同余方程,还是看了那本书<<挑战程序设计竞赛>>,我觉得这本书挺易懂的,三言两语概括了精髓,看起来也不会那么纠结,代码实现也很简练.解线性同余方程这一块看了颇久才理解到它的原理,实际上就想多米诺一个推倒另一个的感觉.然后学习了一下中国剩余定理,实际上是给出了x=ai(mod mi)的其中mi两两互质的一个解的形式,记Mi=m1*m2..*mn/mi 则方程的解应为 x=M1M1'a1+M2M2'a2+...(mod m1*m2..*mn)
其中Mi'为Mi在mi下的逆元,即Mi*Mi'=1(mod mi) 下面证明解符合题意.对于任意一个方程 x=ai(mod mi) 和j!=i 都有mi|Mj.
故 x=M1M1'a1+M2M2'a2+...(mod mi)-->>x=MiMi'ai(mod mi)-->> x=ai(mod i). 所以这个解是满足条件的
代码实现也是大同小异,关键也是算逆元那一块,在此不做细究
接下来学习了博弈的相关内容,这部分的内容相当神奇,尤其是我第一次知道Nim可以用抑或直接给出答案的时候..我和我的小伙伴们都惊呆了.后来深入的学习了一下,原理的正确性就不深究了(我终究是一个懒于啃复杂知识的应用流派...)对于任何一种状态x sg(x)表示该状态的所有后继中的sg值没有出现的第一个非负整数.的确是挺绕口的...以Nim为例,sg(0)=0(因为0没有后继 所有就是0) 1有后继0,因为sg(0)=0,故第一个没有出现的是1,sg(1)=1....以此类推.sg(i)=i;i+1的后继有0,1,2,...i,其sg值分别是0,1,2,3,....i,所以sg(i+1)=i+1.更加复杂的sg会有复杂的后继,有些只允许你去抽一定数目,这个时候的sg计算可能能找到规律,可能不可以.可以的打表做,不可以的时候自己递推搜索.想起了省赛的一道题,打了一张sg表,找不到规律,赛后才知道,那道题有些点是能确定下来的,即知道其sg值,其余的都要靠logn一个的时间内搜,甚是神奇.还有看了书上的一道例题POJ2311,它每次剪完之后会变成两张纸,而这个时候sg值的计算方法是算其所有切法,分成两张的情况下抑或的sg值,然后再找没有出现过的,例题代码用了set+记忆化搜索找,900ms颇慢,假如迭代找就会快很多,40ms吧,这提醒我姿势很重要.然后看了这题去年省赛的一道题就有点眉目了,那个题目是切绳子,每次切会有切短的情况,也会有切成两半的情况,这时也是类似的处理吧.思路这东西真的是一通百通.
有些复杂的博弈则是靠YY出来,其中一种就是对称性的构造判断,假如现在有两堆一样的东西,如果对方只能对其中一堆操作的话,无论对方做什么,你都可以模仿,这时候不管怎么样,你都可以做下一步,因为你总是拷贝别人的操作,所以这时是必胜态,这种思想在博弈YY中还是相当重要的
总结一下今天学习的内容:
1.同余模方程
2.中国剩余定理
3.SG值的计算(会分成多堆的情况也学习了)
4.博弈的思想