CF838C-Future Failure【dp,子集卷积】
1|0正题
题目链接:https://www.luogu.com.cn/problem/CF838C
1|1题目大意
一个字符串,两个人轮流操作,每次每个人可以选择删掉一个字符或者重排列这个字符串,但是不能出现之前出现过的字符串,不能操作者输。
求有多少个长度为且字符集大小为的字符串使得先手必胜。
1|2解题思路
显然如果删掉一个字符能使得先手必败,那么先手必胜。如果不能,那么肯定会一直重排列这个字符串。
那么如果一个字符串的排列数是偶数,那么先手可以切换先后手,所以先手必胜。否则先手需要考虑能否删除一个字符使得先手必败。
设第个字符的数量是,那么一个字符串可重排列的方案就是,并且如果删除一个字符,那么排列方式将会乘上。
那么如果是奇数,肯定存在一个是奇数,也就是说删除一个后排列方式的奇偶性不变。所以如果一个是奇数且字符串的排列数是奇数,那么肯定可以删除一个字符使得排列数仍然是偶数。
那么如果是奇数且先手,那么肯定不会被逼到一个走动后先手必胜的位置,所以是奇数先手必胜。
然后如果是偶数,那么如果排列方式是偶数那么先手必胜否则先手必败。
然后考虑怎么计数是偶数的情况。考虑到一个包含的质因数的个数为,那么如果一个字符串的排列方式是偶数那么肯定有
然后又因为假设我们考虑一直分解出来,显然的肯定不会比中多,同理分解出来也是一样的,所以它们每一个求出来的答案都是恰好相等的,即
那么求和的时候二进制就不能有进位了,也就是说对于中的每个,都恰好有一个是,中的每一个,这一位都是。
也就是把的二进制分成若干份,每一份的贡献是,要求贡献的乘积和。这个分出一个部分来的转移其实就是子集卷积,所以我们跑次子集卷积即可。
这样跑有点慢,所以我们还需要快速幂优化。
时间复杂度:
1|3code
__EOF__

本文链接:https://www.cnblogs.com/QuantAsk/p/16084426.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2021-03-31 P5666-[CSP-S2019]树的重心【树状数组】
2021-03-31 CF891E-Lust【EGF】
2021-03-31 POJ3734-Blocks【EGF】
2021-03-31 P4494-[HAOI2018]反色游戏【圆方树】
2021-03-31 P7323-[WC2021]括号路径【并查集,启发式合并】
2021-03-31 P4199-万径人踪灭【FFT】
2021-03-31 P4640-[BJWC2008]王之财宝【OGF,Lucas定理】