做点数学题。
\(\mathit1\)
题意:给定长度为 \(n\) 的序列 \(a\),\(m\) 次询问,每次给定 \(l,r\) 和 \(k\),求 \(\sum\limits_{i=l}^r a_i\left(\begin{matrix}i-l\\k\end{matrix}\right)\) 的值。
\(1\le n,m,\sum k\le10^5\)。模数为素数。
我们先思考 \(\sum k\le10^5\) 这个限制。容易让人联想到根号分治。\(k>\sqrt n\) 时直接暴力,最多 \(O(\sqrt n)\) 次。但 \(k\le\sqrt n\) 时怎么做?有一个很厉害的东西就是:
那么这个就可以直接预处理 \(f(i,j)=\sum\limits_{x=0}^j a_x\left(\begin{matrix}i\\x\end{matrix}\right)\),然后查询的时候按照上式算即可。
\(\mathit2\)
题意:计数 \(n\times m\) 的矩阵,其元素属于 \(1\) 到 \(c\) 中的整数,且没有两行一模一样,也没有两列一模一样。
\(1\le n,m,c\le4\times10^3\)。任意模数。
这个题直接推通项好像是不太可做,但是有一个特别巧妙的思路。令 \(f_i\) 表示 \(n\) 行 \(i\) 列的答案数量。那么考虑容斥,有以下式子:
这个枚举的 \(j\) 就是在枚举本质不同列数,看成 \(j\) 个无标号盒子。而斯特林数表示枚举每一列所在的盒子情况。然后缩成了 \(j\) 列。不难发现这个矩阵每两列互不相同就等价于原来矩阵原来矩阵每两个盒子所代表的列互不相同。这样就不重不漏地减去了不合法方案。
\(\mathit3\)
题意:对于所有值域为 \([1,m]\) 的长度为 \(n\) 的整数序列,对其本质不同子序列数求和。
\(1\le n,m\le 10^6\)。模数为素数(当然可以任意模数做)。
考虑拆贡献,枚举每一个子序列的出现次数。对于一个长度为 \(k\) 的序列,它包含在多少序列中呢?我们可以考虑朴素地 dp,令 \(f_{i,j}\) 为长度为 \(i\),且包含这个序列的最长前缀是 \(j\) 的方案数。那么显然有:
将其转化为路径计数,枚举第一次走到纵坐标为 \(m\) 的位置,然后推推式子就好了。最后的式子有点不优美,是:
我看题解都没带组合数。这是为啥。