CF8E 题解

blog。抽象意义上单杀了。


首先第一位必定为 0,然后取反串就不用去考虑了。

n50,考虑爆搜。搜整个串的前一半(设半长为 M=n2,前一半的串在十进制下值为 v),后半段的数量可以计算:

  • 整个串最后一位是 0,只需满足逆序串。n 为偶数时方案数为 (2M1v)n 为奇数时方案数为 2(2M1v)
  • 整个串最后一位是 1,只需满足逆序取反串。n 为偶数时方案数为 (2M1v)n 为奇数时方案数为 (2M1v1)
  • 总的来说,n 为偶数时方案数为 2(2M1v)n 为奇数时方案数为 2(2M1v)+(2M1v1)

持续累加合法数量,显然可以找到前一半的答案。然后爆搜后一半的答案即可。

一些细节:全选 0 是不合法的,为了方便可以在最开始 kk+1;维护串时请在全局用数组模拟,use string record

code,时间复杂度 O(n2n),瓶颈在后半段的爆搜,替换成二分可以做到 O(2n)

posted @   liangbowen  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示