省选模拟56

A.取石子游戏

题意:n堆石子,第(i)堆有(a_i)个,可以删除掉为d的倍数个数的石子堆,求后手必胜的删除方案数。(n<=5e5,d<=10,a_i<=1e6,sumlimits_{i=1}^n a_i<=1e7)
首先是nim博弈的结论:存在后手必胜的充要条件为(a_i)异或和为零
对于(n<=50,a_i<=10000),设(f[i][j][k])表示考虑了前(i)堆石子,删除堆数(%d=j),未删除的堆xor值为(k)的方案数
此时没有用到(sumlimits_{i=1}^n a_i<=1e7)的条件
(a_i)按降序排序,那么每次不小于(a_i)最高位+1位的k都不可能贡献答案,这样的话复杂度为(O(nd imes cnt[2^{i-1},2_i-1]2_i)),不会超过(O(ndsum a_i))

B.路径计数

题意:n个点m条边的有向图,q次询问s->t走d条边且s只在起点t只在终点经过的方案数。(n<=100,d<=50,q<=5e5)
暴力的话直接dp(f[s][i][t][d])表示起点s终点t现在在i走了d条边的方案数,然后统一回答。
限制只有两个,可以考虑容斥。
(f[i][j][k])表示走恰好k步(i->j)且不经过(i,j)的方案数
(g[i][j][k])表示恰好走k步(i->j)的方案数,这个没有限制直接枚举起点拓展终点dp,复杂度为(O(n^3d))
(h[i][j][k])表示恰好走k步(i->i)且不经过(j)的方案数
考虑如何求答案(f)
用总方案数-不合法的,前者显然是g,后面的分类为第一个不合法为i或j
(f[i][j][k]=g[i][j][k]-sumlimits_{d=1}^{k-1}h[i][j][d]g[i][j][k-d]-sumlimits_{d=1}^{k-1}f[i][j][d]g[j][j][k-d])
(h[i][j][k]=g[i][j][k]-sumlimits_{d=1}^{k-1}h[i][j][d]g[i][i][k-d]-sumlimits_{d=1}^{k-1}f[i][j][d]g[j][i][k-d])
同时注意(i=j)的情况会被多减一次。

C.方格操作

题意:(n imes m)的01方格图,定义操作为把1的所在行和列异或一,本身变为0。每次对图中所有1同时操作,权值为1的个数,直到图中无1。(n,m<=1e5)
定义(f[i])为i行1个数的奇偶性,(g[i])为i列同理
那么((i,j))一轮操作后会变成(f[i] xor g[j])
因为只关心每个格子所在的行和列有多少1,而不关心具体位置,交换行和列对答案没有影响。
于是把(f[i]=0)的放上边,(g[j]=0)的放左边,会形成4个块,每个块要变化产生的值都是相同的,将问题的规模缩小到了(2 imes 2),除了初始方格图只有左下和右上两个块会有贡献,同时可以再次按照此规则移动行列,若不循环则最多(2^4)次。
现在的问题在于求出初始图的贡献和(f[i],g[i]),后者差分即可,前者用扫描线+线段树可以解决。

原文地址:https://www.cnblogs.com/hzoi-yzh/p/12589709.html