这题显示只有18%的AC率,题目本身不难,估计都是败在执行时间上了;我的解法如下,典型的DP思维,子问题是:如果已知长度为n-1的情况下,和或操作相等的数列,求长度为n的情况;状态index为每个满足条件的数列的和Sn-1(因为和或相等,也是该数列的或),状态值为该index对应的数列有多少种。状态转移方程为:
if Xn | Sn-1 == Xn + Sn-1: then Stat[Xn|Sn-1] += Stat[Sn-1]
class YetAnotherORProblem2: def countSequences(self, n, r): ls = {0:1} c = 0 mc = 1 while mc < r: mc <<= 1 mc -= 1 for i in range(0, n+1): if i == n: for k,v in ls.items(): c += v return c%1000000009 cs = {0:0} for k,v in ls.items(): mask = mc^k # 这里是个重要的优化,大于mask+1的值不可能满足条件 for j in range(0, mask+1): if k & j == 0: cs[k+j] = cs.get(k+j, 0) + v ls = cs.copy()