(1)Boring Game Between DD and Lanrete
先说1维的情况,硬币排成一排,每次最多翻转两个(不一定相邻),要求被翻转的硬币最右边那个一定是正面朝上的。
这个等价于NIM,可以把从左到有i (i=1,2,3..n) 个正面朝上的硬币看成一个有i个石子的堆。每次如果只翻转第i个,相当于把含有i个石子的堆走。如果翻转第i和第j个(i>j),则相当于把含有i个石子的堆拿到剩下j个停止。特别地,如果翻转前第j个硬币是正面朝上的,翻转后对应到NIM,相当于有2个含有j个石子的堆,这并不影响整个局面的异或和,即这两堆可以去掉而不影响博弈结果。这就完成了从这个问题到NIM的转化,反之亦然。
但是对应到2维,我并没搞清楚这个问题怎么和NIM等价,2维的要求是同时翻一个矩形的4个角——在保证右下角翻转前是正面朝上的前提下。
查了一些资料,基本上都是直接给出的结论。g(x,y)=mex{g(a,y)^g(x,b)^g(a,b)
(5)
求给定 A、D、 P、 M, 求A^x == D (mod P) ,这样的x,满足0<=x<=M的个数。
P<2^31
这个题目比较麻烦。
先要求出a^x==b (mod c)的最小的x
大概做法:
则把它提取出来。同于式两边同时除以g,,由同于的性质,c也除以g。这样反复提取了若干个a,注意这时c变为c’,直到c’与a互质或者它们的最大公约数不能被b整除。
假设前面提取了i个a出来,最后式子变成了
t*a^y==b’ (mod c’)
这里的t实际上是由1每次乘上(a/g)的结果(注意g也在变化)。经过这样的变化之后,事实上y=(x-i),另外如果在i此之内已经找到了解就算找到了。这样的过程至多持续log(max(b,c)) 次,因为b和c每次至少除以2.。这样做的好处是有(t,c)=1 这对后面直观重要。
很久没写了,有工夫会补之前的。。。
(1)
模拟题,直接模拟就行。细节就是,消去一些球后,其他球会下降。不过,直接实现起运行速度并不快。
(2)
就是求一个区域的整点个数。空白都是三角形,所以区域很规则。问题是如何表示这个区域。可以把一个模式看作上半个正方形框和下边完全空白的半个正方形的组合,即整个模式看作正方形。然后空白的区域只要记录它的右下角或者左上角就可以了。大概做法是,给定(x,y),递归判断这个点所在的区域,(分为在边界上、在下半空白区域内、以及其他三个区域内),累计空白的点数(用乘法),得到区域的一个标识(左上和右下角坐标)。然后,对每个给定的点都如此做,对统计的空白点数求和,同样的区域标识只累加一次(用map)。还要注意使用long long。
(3)
给定n个木板(n<=16),可以连接,求能组成的最大矩形面积。不大会这种搜索题,但是很感兴趣。我的做法比较诡异,我先考虑前一半的木板,用bit位表示状态,如果m=