【日总结】2022.11.20

持续更新 做了多少东西就放多少东西)

次小质因子前缀和

【UR #13】Sanrd

\(f(x)\)\(x\) 的次大质因子,若 \(x\) 为质数或 \(1\)\(f(x)=0\),求 \(f(x)\) 的前缀和。\(x \le 10^{11}\)

考虑 min_25 筛:首先先看一般 min_25 筛的式子,看看我们需要做什么。

\[F(x,j)=\sum_{i\ge j} f(p_i)+\sum_{\substack{k\ge j\\p_k\le \sqrt n}}\sum_{\substack{e\ge 1\\p_k^{e+1} \le n}}\left(f(p_k^e)F\left(\frac{x}{p_k^e},k+1\right)+f(p_k^{e+1})\right) \]

那么我们考虑 \(f(x)\) 怎么去求:首先对于前面的质数处的点值肯定为 \(0\),而考虑每次消一个质因子的贡献。对于形如 \(f(p_k^e\times \cdots)\) 的数,我们枚举了一个质因子,假如现在除去这个质因子就仅剩下一个质数了,那么这个数就一定是质因子,否则当前这个数就没贡献,\(f(x)=f(\frac{x}{p_k^e})\);对于形如 \(p_k^{e+1}\) 的数,答案就是 \(p_k\)。那么我们就可以将 min_25 的式子改写为以下形式:

\[F(x,j)=\sum_{\substack{k\ge j\\p_k\le \sqrt n}}\sum_{\substack{e\ge 1\\p_k^{e+1} \le n}}\left(F\left(\frac{x}{p_k^e} + ,k+1\right)+\left(G\left(\frac{x}{p_k^e}\right) - k\right)p_k + p_k\right) \]

然后直接套 min_25 筛的板子就做完了。

「LibreOJ Round #11」Misaka Network 与求和

随便推一下式子,发现题目要求的就是 \(f^k * \mu\) 的前缀和。

显然考虑杜教筛,卷一个 \(I\) 即可消去 \(\mu\),然后再求 \(f^k\) 的前缀和,这部分直接套用上面的做法即可。

有向图判环

昨晚上想了一下,然后补一下昨天的那个判环算法。

对于每一条边,判断是否存在包括 \(u-v\) 边的环。

可以从每个点开始,考虑每个点最靠左能被哪个点到达,最靠右能被哪个点到达,这个可以直接从左到右 DFS,再从右到左 DFS 做到。然后如果这个点最靠左只能是从自己到达,最靠右也只能从自己到达,那这就不存在包含这条边的环。

杂题

[ARC149E] Sliding Window Sort

昨晚上写这个题的题解,把代码复制到洛谷博客上之后电脑黑屏了。

然后就不打算再写一遍了,太恶心了。

但是毕竟是没看题解做出来的题,还是要写一个大致做法纪念一下。

手模一下发现这东西类似于一个小根堆加一个队列,每次操作相当于弹出堆顶放到队列尾,然后将队列首插入堆。

发现这样的操作操作若干次后,比较大的数就永远在堆的底下了,每次只会将堆顶与队列进行循环。这样我们可以通过终止状态推出 \(k\) 较小时候的状态。这时候就可以把原题的环上问题变成链上问题了。如果 \(k\) 比较小,发现序列的最后几个数就是没有用的,可以直接删掉,总之我们可以将任意问题转换成 \(k=n-m+1\) 的情况。

然后计数这东西可以考虑一下加数的过程,如果现在的数比堆中的数要小,那肯定这个数是新加进去的,就只能放在最后一位,否则这个数可以是之前堆里就有的也可以是在最后一位新加进去的。设后者的数量有 \(t\) 个,那么答案就是 \(m^t(m-1)!\)\((m-1)!\) 是因为还有 \(m-1\) 个数没填,这几个数可以任意填。

另外还需要判断一下是否无解。

[ARC150D] Removing Gacha

好题?

首先根据期望的线性性,答案应该就是每个点被选多少次之后成为好点的期望值的和。

于是我们单独来考虑一个点,那么这个点成为好点当且仅当这个点到根的路径都被选择过了。这个是经典赠券收集问题,答案就是 \(\sum_{i=1}^n\frac{n}{i}\),那么其中一个点被选中的期望次数就是 \(\sum_{i=1}^n\frac{1}{i}\)

于是处理出来每个点的深度,然后预处理出来调和级数,就可以求答案了。

lyin 说这是经典结论,事实证明我做题确实还是太少了。

[ARC147D] Sets Scores

钓鱼题)

题意可以转化成:有一个长度为 \(m\) 的 01 串,进行 \(n-1\) 次操作,每次翻转一位,定义这样的初始串与操作序列的权值为最后得到的 \(n\) 个 01 串中每一位的 1 的数量的乘积。

感觉给定一个操作序列求权值这件事情就很困难,但是注意到是对所有方案求和,那么我们考虑对于某一种操作序列,将所有的初始 01 串的权值和加起来。发现如果 01 串的某一位初始为 0 与 1,其这一位的 1 的数量加起来正好是 \(n\)。那么其实对于所有的 01 串,权值和就是 \(n^m\),而操作序列有 \(m^{n-1}\) 种,那么答案就是 \(n^mm^{n-1}\)

这个数据范围给的怎么看怎么像是 \(O(n)\)\(O(n\log n)\) 的 DP,想了半天才想到直接把所有方案全加起来,太钓鱼了。


思考要不要去做难度高于 3000 的题,感觉做了没啥意义,自己啥也想不出来还浪费时间..?


发现了好东西:emoji

测试:🤔 😅

posted @ 2022-11-20 08:07  APJifengc  阅读(117)  评论(7编辑  收藏  举报