tran

[ABC317F] Nim

这个问题可以通过数位动态规划(DP)来解决。

我们考虑以下的数位DP来确定从二进制表示的最低位开始的下一位:

DP[n][f1][f2][f3][r1][r2][r3]= 满足以下条件的整数组 (x1,x2,x3) 的个数:

  • 对于所有 i0xi<2n
  • x1x2x3=0
  • 对于每个 i,"xiN&(2n1) 以下"的真假为 fi
  • 对于每个 ixi 除以 Ai 的余数为 ri

这里,& 表示按位与运算。也就是说,N&(2n1) 表示 N 的二进制表示的最低 n 位的值。

通过尝试每个 xi 在二进制表示中从最低位开始的 n 位的值(共 23 种可能),我们可以从 DP[n][][][][][][] 推导出 DP[n+1][][][][][][]

根据给定的约束条件 N<260DP[60][True][True][True][0][0][0] 表示满足以下条件的整数组 (x1,x2,x3) 的个数:

  • 对于所有 i0xiN
  • x1x2x3=0
  • 对于每个 ixiAi 的倍数

所求答案是从第一个条件为 "对于所有 i1xiN" 的情况中减去得到的结果,即:

  • 对于某个 ixi=0
  • x1x2x3=0
  • 对于每个 ixiAi 的倍数

这个可以很容易地计算出来。(分别令 x1,x2,x3=0,计算剩余二者的 lcm,最后算出来,注意还有三者均为 0)。

计算复杂度为 O(logNAi)

code

本文作者:wscqwq

本文链接:https://www.cnblogs.com/wscqwq/p/17659950.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wscqwq  阅读(18)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起