CF285E

(1sim n)排列的完美数 有多少个(i)满足(|P_i-i|=1),求有多少个长度为(n)的完美数恰好为(m)的排列

因为恰好,容易想到二项式反演

令完美数恰好为(m)的排列数(G(m)),构造方案数,强行令(m)个位置完美,剩下的放任自流方案数为(F(m)),对于一种完美数为(M)的排列,在(F(m))中会被统计(large {Mchoose m})

(large F(m)=sumlimits_{i=m}^n{ichoose m}G(i))

二项式反演(large G(m)=sumlimits_{i=m}^n(-1)^{i-m}{ichoose m}F(i)),所以求(F)导出(G)

(f[i][j][0/1][0/1])为前(i)个位置,选取(j)个完美位置,选或不选(i+1)(0)是选

作为完美位

(i-1)

(f[i][j][0][0]+=f[i-1][j-1][0][0]); (f[i][j][1][0]+=f[i-1][j-1][0][1])

选择(i+1)

(f[i][j][0][1]+=f[i-1][j-1][0][0]+f[i-1][j-1][1][0])

(f[i][j][1][1]+=f[i-1][j-1][0][1]+f[i-1][j-1][1][1])

不作为完美位

(f[i][j][0][0]+=f[i-1][j][0][0]+f[i-1][j][1][0])

(f[i][j][1][0]+=f[i-1][j][0][1]+f[i-1][j][1][1])

(i=1)(i=n)

边界(f[1][0][0][0]=1) (f[1][1][0][1]=1)

(i=n)去掉(i+1)转移

(F(m)=(f[n][n][0][0]+f[n][m][1][0])*(n-m)!)

扔进反演式子就好

(G(m)=largesumlimits_{i=m}^n(-1)^{i-m}{ichoose m}(f[n][i][0]+f[n][i][1])*(n-i)!)

原文地址:https://www.cnblogs.com/shikeyu/p/13801402.html