再次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_{n,m}=S(n+1,n-m+1)\)。
但是这个题目 \(n\) 太大了,不好直接算,所以我们需要考虑跟 \(m\) 相关的算法。我们发现大于 \(1\) 的环最多只有 \(m\) 个,那么我们设 \(f_{i,j}\) 表示 \(i+j\) 个点,放进 \(j\) 大小 \(>1\) 的个圆的排列方案数。
那么答案就是:
你考虑 \(f_{i,j}\) 怎么算。对于第 \(i\) 个点,你可以加入前面的任意一个环,贡献为 \(i+j-1\),你也可以新开一个大小为 \(2\) 的环,同时你需要从前面选一个来组队,贡献亦为 \(i+j-1\),所以我们得到转移式:
复杂度大概是 \(\Theta(\log^4 n)\) 。
Code
并没有呢,先生。