【2023.7.22/HAOI2018】渺小如褐蚁也只能蓄力一搏,企图撼动命运的终末

发布时间 2023-07-22 17:51:41作者: Skylakes

奇怪的背包

首先一个物品 \(v\) 能做的贡献是 \(k\times \gcd(v,P)\),所以一开始 \(v\gets \gcd(v,P)\)

感觉很神秘啊,复杂度估计是个 \(\mathcal O(n+m+\sqrt P)\) 或者 \(\mathcal O(n\ln P)\) 或者 \(\mathcal O(n\pi(P)),\mathcal O(nd(P))\) 状物。

枚举一下做法。关注一下特殊元素,注意到 \(v=1\) 的话非常棒啊,你再选一个 \(d\),用 \(1\)\(w-d\),再塞一个 \(d\) 就行。

发现这个东西好像和序列没啥关系,那我放到值域上。其实 \(v\) 的元素都是 \(P\) 的因数,那就 \(d(P)\le 10^3\) 个,这样就凑出来 \(d(P)\) 了!是不是可以 \(\mathcal O(nd(P))\)

\(v=1\) 的话显然随便选,记 \(v=1\) 的有 \(cnt\) 个,那答案就是 \(2^{n-cnt}\times (2^{cnt}-1)\)

没有 \(v=1\) 时特殊考虑,小凯的疑惑有结论 \(a\times b - a - b\),但是我好像不太会用。很有感觉,但搞不出来,水平不是很够。其实感觉这里已经可以阈值分治乱搞过了,但不会,菜。

看题解。

为啥 \(x,y\) 能凑出 \(\gcd(x,y)\) 啊。沃趣忘了是总重量对 \(P\) 取模,shaber。

那就简单了啊,只要选出的 gcd 是 \(w\) 的因数即可。 \(f(i,j)\) 表示考虑前 \(i\)\(P\) 的约数,选出来 gcd 为 \(a_j\) 的方案数。\(f(i,j)=f(i-1,j)+\sum\limits_{k,\gcd(a_k,a_i)=a_j} f(i-1,k)\times (2^{cnt_i}-1)\)

时间复杂度 \(\mathcal O(qd(n)+\sqrt P)\),过不去啊。咋办。看题解。

哦,有用的只有 \(\gcd(P,w)\) 的约数,这样就可以预处理了,\(\mathcal O(d^2(P)\log d(P)+\sqrt P)\)。这么 trivial 怎么没想到?

反色游戏

不会这个题呜呜,看题解了。

从整张图入手,有两种方法可以得出这道题的结论:

  • 高斯消元:把矩阵列出来,不难发现矩阵的秩为 \(n-1\),那么方案数即为 \(2^{m-n+1}\)
  • 构造法:我们考虑一棵树。根据经典的剥叶子型构造手法,我们可以得出一棵树的时候方案数唯一,除非要求 \(1\) 的点数为奇数,那样状态异或和为 \(1\),而我们的操作状态异或和始终为 \(0\),所以构造不出来。反之我们随便抽出来一棵生成树,对于其它边,显然取或不取只会反转两个点的状态,而我们的构造法永远可以构造出唯一解,所以方案数就是 \(2^{m-n+1}\)

然后我们考虑这个原问题。图上就那么几个知识点,这题又和割点强相关,那就考虑广义圆方树。

假设一开始有 \(\rm cnt\) 个连通块,\(i\)\(\mathrm{deg}_i\) 条连边,和 \(\mathrm{cut}_i\) 个方点相连,并且 \(i\) 断开后没有一个连通块内有奇点,那么方案数就是 \(2^{m-n-\mathrm{deg}_i+\mathrm{cnt}+1+\mathrm{cut}_i}\)。时间复杂度 \(\mathcal O(Tn)\)。甚至不用显式地建出来圆方树,因为我们只需要 \(\rm sz\)\(\rm cut\) 两个数组,直接求割点就行。

字串覆盖

两年前的我这么强吗,还会写 30pts,现在的我 30pts 都写不出来。这种字符串工业太可怕了!

好吧,其实做法的提示性很强,这个东西明摆着是让你根号分治的。难点在于维护而不在于贪心。

我先口胡一个东西看看对不对啊。跑 SA,设阈值是 \(B\),然后 \(\gt B\) 的直接二分出来 \(\rm sa\) 范围,然后扔主席树上不停进行区间查询时间复杂度是 \(\mathcal O(\frac{nq}{B}\log n)\) 的一个东西。然后 \(\le B\) 的子串只有 \(\Theta(nB)\) 个。怎么预处理来着?

哦好像题目里规定了 \(\le B\) 的很少,\(r-l\) 随机均匀这个性质咋用?是想告诉我默认 \(\tilde O(r-l)=1000\) 吗?

那我是不是还是可以和上面那个东西一样暴力跑啊 /qd。

看一眼 myee 的题解,好像还真行,\(X=50,Y=2000\) 的话这个东西的复杂度就是

\[\mathcal O(\frac{\log n}{Y-X}\int_X^Y \frac{n}{x}\, \mathrm d x) = \mathcal O(n\log n\frac{\ln Y - \ln X}{Y-X}) \]

我不会微积分啊,这个式子是抄的。写完这个一定要学一学微积分,要不然这种细致复杂度分析不会做 /ng。(学不会,开摆)

好像还有 \(r-l\le X\) 的情况,这个咋办来着。

一般来说字符串这种东西可以反着来,想一想出题人会怎么卡。他要卡我的话肯定能匹配的越多越好,那这样的话询问的本质不同串是不是不会多。

看题解。好吧,首先按上面的方法找到第一个位置,然后倍增预处理就行。不想写代码,啥时候闲的蛋疼了再写。

苹果树

非常暴力的组合数计数。

考虑拆贡献,对 \(i\) 节点,我们枚举 \(k = sz_i\),计算 \(i\) 子树大小为 \(k\) 的方案数,然后直接暴力乘起来。

\(i\) 子树内的方案数是 \((k - 1)!\times \binom{n - i}{k - 1}\),表示 \(\gt i\) 的树中选 \(k - 1\) 个进行排列,然后 \(i\) 子树外的方案数是 \(i!\times (i + 1 - 2)\times (i + 2 - 2)\dots \times (n - k + 1 - 2) = i\times (i - 1)\times (n - k - 1)!\)

那么 \(i\) 的方案数就是 \(\sum_{k=1}^{n-i+1} k\times (n - k)\times (k - 1)!\times \binom{n - i}{k - 1}\times i\times (i-1) \times (n - k - 1)!\)

事实上,还有另外一种拆贡献方式,这也更符合拆贡献的本源的定义。学习自 myee。

考虑一个 dp,设 \(f_n\) 表示 \(n\) 个点的树,到根节点的距离和。

枚举左子树大小 \(i\),显然有:

\[f_n = \sum\limits_{i = 0}^{n-1} \binom{n-1}{i}f_i\times (n - i - 1)!+f_{n-i-1}\times (n-i-1)! + (i + n - i - 1)\times i!\times (n-i-1)! \]

然后设答案为 \(g_n\),则有:

\[g_n = \sum\limits_{i = 0}^{n - 1} g_i\times (n - i - 1)! + g_{n - i - 1}\times i! + (n - i - 1)!\times (n - i - 1)\times (f_i + i!\times i) + i!\times i\times (f_{n - i - 1} + (n - i - 1)!\times (n - i - 1)) \]

然后就可以 \(\mathcal O(n^2)\) 递推了。

这道题体现的是一种拆贡献的思想。首先,子树问题的刻画方式是枚举其中一棵子树的关键信息,这道题就是左子树的大小,然后两棵子树之间的贡献可以通过拆贡献,分开来计算。

方案数

当时的 markdown 源文件找不到了,不放了。反正 NTT 现在又不考,会二项式反演就行。