Wannafly挑战赛11

A

B

C(轮廓线dp)

题意:

  

  

分析:

  如果以(i,j)为右下角考虑设计dp,那么会需要用到多余的状态,这样状态就很爆炸了

  仍旧考虑轮廓线dp,维护一个格子上的轮廓线的m个状态,考虑从dp(i,j)转移到一个dp(i,j+k)

  即以(i,j)为矩形的左下角去枚举转移,这样只需要轮廓线上的状态就满足了

  时间复杂度O(nm*(2^m)*k)

  代码

D(hash/SAM)

题意:

  

分析:

  对于每个s建立SAM,t在上面查询,这是经典问题,时间复杂度是O(26len),但常数比较大被卡常了

  可以用hash来解决,时间复杂度是O(lenlog|T|)的,但常数比SAM要小,不过因为很长,所以出现冲突的概率就很大,就要用双hash

E(多项式)

题意:

  

  

分析:

  对于$ans_t$,本质上就是多项式$(1+x)^n$的展开式中所有模k余t的项的系数和,从而可以看做是n个长度为k的多项式(1+x)的循环卷积的第t项的系数

  因为k是2的幂次,所以k|(998244353-1),所以可以求出单位根在对应的0~k-1次幂下原本多项式的点值,然后NTT插出循环卷积的多项式即可

  注意到n很大,但我们只需要求类似$a^n % P$,指数对P-1取模不会改变结果

  代码

 F(分治NTT)

题意:

  

  

分析:

  首先分析获胜的概率

  若只考虑一堆,那么先手是赢还是输这取决于几步把这个堆取完

  奇数次把这个堆取完的方案数是C(num-1,0)+C(num-1,2)+C(num-1,4)+.....

  偶数次把这个堆取完的方案数是C(num-1,1)+C(num-1,3)+C(num-1,5)+.....

  这两个值是相同的,所以获胜概率其实是相同的

  考虑所有堆,获胜概率应该也是相同的,所以答案是1/2

  但要考虑特殊情况,那就是若所有堆都是1,那么概率要么是0,要么是1,这取决于堆数的奇偶性

  考虑第二个问题,即有多少种取的方法使得先手获胜,同样,这也只是取决于取完所有石子的步数的奇偶性

  f[i][j]表示前i堆j次操作完的方案数,很显然有这样的式子f[i][j]=Σf[i-1][j-k]*C(a[i]-1,k-1)*C(j,k) (1<=k<=a[i])

  后面这个推一推可以用NTT优化

  但是这题n的范围没有给,所以很可能出现这种情况:25000 1 1 1 1 .....,这样时间复杂度会降至O(len^2log(len)),会TLE

  这个式子的本质是这样的:f(i)=f(i-1)与h(i)的卷积

  这个东西其实就是h(1) h(2) h(3) ... h(n)的卷积,分治NTT解决就行了,时间复杂度$O(lenlog^2len)$

  具体实现的时候也不需要递归分治,只需要把h(1) h(2) h(3) ... h(n)丢到一个队列里,然后每次取出队首进行卷积,卷积结果丢到队尾就行了

  代码

posted @ 2018-03-14 15:45  Chellyutaha  阅读(167)  评论(0编辑  收藏  举报