H. 【普及】二进制中1的个数

    传统题 100ms 32MiB

【普及】二进制中1的个数

【普及】二进制中1的个数

给定整数 nnmm ,计算和

$$\displaystyle \sum_{k=0}^{n} \rm{popcount} (k \mathbin{\&} m) \bmod 998244353$$

这里, &\mathbin{\&} 表示位操作 AND\rm{AND}

什么是 & 运算?
  • 0&0=00 \mathbin{\&} 0 = 0
  • 0&1=00 \mathbin{\&} 1 = 0
  • 1&0=01 \mathbin{\&} 0 = 0
  • 1&1=11 \mathbin{\&} 1 = 1
  • 也就是只有 221 结果才是 11,否则结果为 00
什么是 popcount

popcount\rm{popcount} (x)(x) 表示 xx 的二进制表示中 11 的个数,比如:

  • 13=1101(2)13=1101_{(2)} ,所以是 popcount\rm{popcount} (13)=3(13) = 3

输入格式

输入一行包含 22 个正整数 n,m(0n,m2601)n, m(0 \le n, m \le 2^{60} - 1)

请注意 n,mn, m 的数据范围!!

输出格式

对于每组数据输出一行,包含答案

4 3
4
1152921504606846975 1152921504606846975
499791890

提示

【样例 1 解释】

  • popcount(0&3)=0\rm{popcount}(0\mathbin{\&}3) = 0
  • popcount(1&3)=1\rm{popcount}(1\mathbin{\&}3) = 1
  • popcount(2&3)=1\rm{popcount}(2\mathbin{\&}3) = 1
  • popcount(3&3)=2\rm{popcount}(3\mathbin{\&}3) = 2
  • popcount(4&3)=0\rm{popcount}(4\mathbin{\&}3) = 0
  • 答案为:0+1+1+2+0=40+1+1+2+0=4
  • 请注意将最后的答案对 998244353 取模

【数据范围】

  • 0n,m26010 \le n, m \le 2^{60} - 1
请思考后再点击查看提示

来源