杂题题解 Round2

心不动则不痛 提交于 2020-02-23 13:39:11

[noiac#551] 矩阵

对于一个 \(n×m\) 的方格纸,求在每个位置填入 \(1∼k\) 的本质不同的方案数。
我们称两个方案是相同的,当且仅当我们可以通过若干次“交换两行”或“交换两列”的操作从一个方案得到另一个方案。
输出答案对 \(10^9+7\) 取模的结果, \(n,m\le45\)

考虑置换群,题目给出的行置换和列置换本质上就是允许重排行列,比较暴力的想法是对两维分别正整数拆分然后组合起来,然后发现较大的一维可以用 dp 做于是背包一下就做完了

code


「SDWC2018 Day2」优秀

先不考虑方案数的限制,考虑画一个折线图出来,可以从下到上按层转移,每两个 1 直接一定会在上一行插入 2 ,每两个 2 一定会在上一层插入 3 ,于是我们枚举当前上一层插入几个可以转移
现在考虑加上方案数的限制,由于方案数要求很小,于是我们直接设 \(f_{i,j,k,l}\) 表示搞完前 i 行,放了 j 个数,还有 k 个空隙,所有合法重排方案数为 l 的数列个数来转移即可
code


Number of M-Coprime Arrays

T 组数据,求满足长度为 n ,所有数都为 m 的约数,相邻两个数互质的数列个数模 \(10^9+7\) 的结果, \(T\le100,n,m\le10^18\)

简单思考之后发现每个素数的贡献可以分开算,假设某个素数最多可以选它的 K 次幂,那么有转移式 \(f_n=f_{n-1}+Kf_{n-2}\) ,发现跟素数无关只跟其最高次幂有关,于是 \(miller-rabin\) +矩乘即可
code


[51nod1739] 小Q的集合 V2

一道恶心人的题,等心情好了写
\(Ans=\sum\limits_{i=0}^nC_n^i|i^k-(n-i)^k|\mod m\)
由于 m 为质数,考虑 lucas 定理有 \(C_n^i\mod m=C_{\lfloor\frac nm\rfloor}^{\lfloor\frac im\rfloor}C_{n\mod m}^{i\mod m}\mod m\)
于是可以重写式子 \(Ans=\sum\limits_{i=0}^{\lfloor\frac nm\rfloor}C_{\lfloor\frac nm\rfloor}^i\sum\limits_{j=0}^{n\mod m}C_{n\mod m}^j|(i*m+j)^k-(n-i*m-j)^k|\)
\(x=i*m+j\) ,当 \(i*2<\lfloor\frac nm\rfloor\) 的时候绝对值展开取模的结果为 \((n\mod m-j)^k-j^k\) ,而对于 \(i'=\lfloor\frac nm\rfloor-i\) 后面的绝对值展开取模的结果为 \(j^k-(n\mod m-j)^k\) ,就抵消了,可见只有 \(\lfloor\frac nm\rfloor\) 为偶数的时候答案不为 0 ,为 \(C_{\lfloor\frac nm\rfloor}^{\lfloor\frac n{2m}\rfloor}\sum\limits_{i=0}^{n\mod m}C_{n\mod m}^i|j^k-(n\mod m-j)^k|\) ,后面的求和是可以 \(O(m)\) 快速计算,问题是前面的组合数,考虑 lucas 定理,发现要转 m 进制,于是要写一个分治 + mtt 优化进制转化,什么毒瘤玩意儿
代码先鸽了


[hdu6607] Easy Math Problem

\[ \begin{aligned} Ans=&\sum\limits_{i=1}^n\sum\limits_{j=1}^n\gcd(i,j)^k\text{lcm}(i,j)[\gcd(i,j)\in P]\\ =&\sum\limits_{d\in P}d^{k+1}\sum\limits_{1\le i,j\le\lfloor\frac nd\rfloor}ij[\gcd(i,j)==1]\\ =&\sum\limits_{d\in P}d^{k+1}\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}i^2\phi(i) \end{aligned} \]
lagrange 插值+min_25筛+杜教筛即可
代码先鸽了


[WC2014]时空穿梭

考虑枚举最后一个点和第一个点构成的向量,令 \(m=\min\{m_1,m_2,...,m_n\}\)
\[ \begin{aligned} Ans=&\sum\limits_{a_1,a_2,...,a_n}C_{\gcd(a_1,a_2,...,a_n)-1}^{c-2}\prod\limits_{i=1}^n(m_i-a_i)\\ =&\sum\limits_{d=1}^mC_{d-1}^{c-2}\sum\limits_{[\gcd(a_1,a_2,...,a_n)==1]}\prod\limits_{i=1}^n(m_i-da_i)\\ =&\sum\limits_{d=1}^mC_{d-1}^{c-2}\sum\limits_{e=1}^{\lfloor\frac md\rfloor}\mu(e)\prod\limits_{i=1}^n\sum\limits_{j=1}^{\lfloor\frac{m_i}{de}\rfloor}(m_i-jde)\\ =&\sum\limits_{T=1}^mF(T)\prod\limits_{i=1}^n(m_i\lfloor\frac{m_i}T\rfloor-\frac{T\lfloor\frac{m_i}T\rfloor(\lfloor\frac{m_i}T\rfloor+1)}2)\\ =&\sum\limits_{T=1}^mF(T)G(m_1,m_2,...,m_n,T) \end{aligned} \]
发现 F 数组可以快速处理出来,而 G 则是一个由 \(n\sqrt m\) 段的分段函数,那么预处理一下区间幂次和然后整除分块就行
代码先鸽了

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!