看了几个课件,挑着比较有意思的写了。
1.
倒推期望,设(dp[i][j])为已经有(i)行(j)列有至少一个被染色的,还需要染的次数的期望。
那么有(dp[n][n]=0),倒推到初始状态即可。
有:
所以:
这样我们(O(n^2))地(dp)就可以了。
2.
先考虑黑点的贡献。
设(dp[i])表示从(i)开始走到结束经过黑点的期望个数。
有:
这样转移出现了环。
发现可以不用高斯消元而系数递推。
得到:
然后我们解一下得到:
这样可以叶子向根进行系数递推了。
复杂度是线性的。
然后我们考虑白色点的贡献。
其实就是经过一个白点的概率。
对于每一个白点,我们去掉其所有儿子并把它染黑,其他点全都染白,这样转化成和刚才一样的问题了。再利用一下系数递推时候求出的(k,b)就可以线性的统计这一部分的答案了。
3.
这个题的话。
考虑把链变成圆,加一个点为(n+1),那么就相当于是从(n+1)出发,选择顺逆时针,在选择一个点作为起点,不能够走回(n+1)这个点的方案数。
那么总方案是((2(n+1))^m),而每一个位置被占据的概率是相同的,是(frac{m}{n+1})。
那么答案就是:((2(n+1))frac{n+1-m}{n+1})。
4.
我们发现这(m)个人很讨厌。我们假设(1)在(1)位置,那么最终答案乘上(2^n)即可。
然后考虑每次和(1)所在区间合并的区间总共有(n)个。
这些区间中最小的那个数将会和(1)对战,我们要求这些区间的最小数没有任何一个是(m)中的某个人。
这样我们求:(f(S))表示(S)集合所代表区间中的所有人的最小值是(m)个人之一,剩下的区间生死未卜的方案数。
我们把(m)个人排个序然后从大到小依次做(dp)。
设(dp[i][S])为前(i)大的人中集合(S)的区间中的最小值必然是(m)个人之一,而剩下的区间生死未卜的方案数。
枚举两种转移。
1.不放入集合中。
2.加入新出现的集合作为最小值。
转移就是:
这样我们就得到了:
考虑用(f(S))来求答案。
那么就有:
5.
设(dp[i][j])为前(i)个数,第(i)个数为(j)的方案数。
相当于容斥掉一整段全都是(j)的长度过于长的方案。
那么发现(a_i)相同的(i)可以一起转移,复杂度就变成(O(n^2))的了。
6.
相当于求出(nk)个数中选择(x)个数((x equiv r(mod k))),的方案。
(dp[i][j])为(i)个数中选了(x)个数,满足(x equiv j(mod k))的方案数。
发现可以用矩阵优化这个(dp),那么矩阵快速幂一下就可以了。
7.
这个感觉是挺常见的计数题的。
对于(k=1),(ans=n)。
如果(k>1)。
我们考虑一个长度为(l)的路径,那么其对答案的贡献是(inom{l-2}{k-2})。
这样我们先求一下数上长度为(i)的方案数,点分治+(FFT)就可以了,设其生成函数为(G(x)=sumlimits_{i=1}^{n}g(i)x^i)
那么我们设答案的生成函数是(F(x)=sumlimits_{i=1}^{n}f(i)x^i)。
这样就有(f(i)=sumlimits_{j=i}^{n}g(j)inom{j-2}{i-2})
拆一下发现是卷积形式。
再做一次(FFT)就可以了。