link
计数类 *3100 首次独立过纪念版题解。
首先我们考虑一个去重的问题。貌似针对循环同构去重的问题,只能从循环节上入手。
那么我们考虑设 为 最小循环节长度恰好为 不同方案数个数,则答案为:
这似乎是一条可行的路。但我们发现确定最小循环节长度是一个较为困难的问题,反而确定存在一个长度为 的循环节(直接固定,类似于二项式反演的思想)更为容易。
所以不妨有设 为存在长度为 的循环节的方案数,则容易有 ,因此由莫比乌斯反演我们知道 。
好了现在让我们来想想 的求法。
一个困扰我们的问题是原问题摆在了环上,但幸好我们可以将原题意转化为求解有多少个环状二进制串,满足 ,存在一个全是一的连续段长度大于等于 。
如果说去掉环的限制显然是一个很 naive 的 DP 题,而环的限制本质上还是对同构提出了要求。
我们考虑字符串 的循环同构串数量,不妨设 为 从 位置开始的循环串。则显然有设 为 的最小循环节长度,有 ,且 互不相同。
这告诉我们 其实也就是只需要考虑填这个串的 位即可,剩下的就是复制的问题了。
好了,现在我们可以考虑怎么去掉个数限制了。
为了方便统计,我们就强行要求 吧。我们不妨设 为在 中填写 个零,且最后一个零是 ,当前是否已经填过长度大于等于 的一连续段。
则对于 两两不同的限制就太简单了,这意味着只考虑 ,将其作为一个循环串,每个位置开头都不一样,这告诉我们如果我们将强制 ,则对于任意一个使用了 个零的合法串,都恰有 个与它同构,这告诉我们 就是填完 ,然后 全部写 ,所产生的贡献。
首先我们进行 的动态规划求出 。
就有 ,初始 。
这个转移显然可以使用差分进行优化。
接着我们有 。
然后我们就可以考虑着手求出 了。
对于 ,由于它要复制 次,我们可以求出其能够填写的零的个数的范围 ,同时枚举最后一个零的位置 ,注意到 全部写一,利用 进行统计即可。
但是我们需要注意到可能会出现类似于统计 ,对于串 011011
这种答案。
我们发现这个串是应该属于 。在这里还多除以了一个 ,因此这提示我们可能需要更改一下朴素的莫比乌斯容斥系数。
一个很简便的方法是:将所有的 直接化为 ,也即直接乘上 ,这样就去除了这种多除的问题。然后最后算答案的时候 再乘上 即可。
复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!