2021-11-14 补题
再次Orz ljs神,又赛场A掉大家都不会的题目。
T1 & T2 & T3
都太蠢了,T1 sb dp,T2 sb 模拟,T3 明明可以 \(\Theta(n\times m)\),出题人却只开到 \(4\times 10^4\) 。
T4
Description
求 \(n!\) 在除去所有 \(2^4\) 之后 ull 意义下的值。
\(n< 2^{64}\)
Solution
funny problem
我们首先看出我们可以分治,就是说我们可以设 \(f(n)\) 表示 \(\prod_{i=1}^{n} i!\) 在去掉 \(2\) 之后的 ull 下的值,最后我们再乘上 \(2^{c\pmod 4}\),其中 \(c\) 就是 \(n!\) 中 \(2\) 的个数。
考虑 \(f(n)\) 怎么算。我们发现我们可以奇偶分类,那么我们就有 \(f(n)=f(n/2)\prod_{i=0}^{n/2-1} (2i+1)\)。
我们考虑展开后面那个,你发现我们最多选 \(63\) 个 \(2i\) ,因为多了就不会产生贡献了。而我们选一个 \(2i\) 相当于我们贡献乘上 \(i\)(去掉因子 \(2\))。
那我们设 \(g_{i,j}\) 表示前面 \(i\) 个数中选 \(j\) 出来的贡献之和。我们就可以得到转移式:
\[g_{i,j}=g_{i-1,j}+g_{i-1,j-1}\times i \]观察第一类斯特林数的式子:
\[S(n,k)=S(n-1,k-1)+S(n-1,k)\times (n-1) \]那么,你就可以发现,\(g_{n,m}=S(n+1,n-m+1)\)。
但是这个题目 \(n\) 太大了,不好直接算,所以我们需要考虑跟 \(m\) 相关的算法。我们发现大于 \(1\) 的环最多只有 \(m\) 个,那么我们设 \(f_{i,j}\) 表示 \(i+j\) 个点,放进 \(j\) 大小 \(>1\) 的个圆的排列方案数。
那么答案就是:
\[\sum_{i=1}^{m} f_{m,i}\binom{n+1}{m+i} \]你考虑 \(f_{i,j}\) 怎么算。对于第 \(i\) 个点,你可以加入前面的任意一个环,贡献为 \(i+j-1\),你也可以新开一个大小为 \(2\) 的环,同时你需要从前面选一个来组队,贡献亦为 \(i+j-1\),所以我们得到转移式:
\[f_{i,j}=(f_{i-1,j}+f_{i-1,j-1})\times (i+j-1) \]复杂度大概是 \(\Theta(\log^4 n)\) 。
Code
并没有呢,先生。