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

并没有呢,先生。