题目描述
原题链接:Codeforces 1761D - Carry Bit。原出题人 unputdownable,经其同意后加强并上传 loj。
注意,不仅修改了数据范围,题意也有改动。
设一个数 v 的二进制表示中 1 的个数为 g(v)。
设 f(x,y)=g(x)+g(y)−g(x+y),也即 x 与 y 二进制相加时的进位数。
现给定 N,k(k≤N),你要对所有 n=k,k+1,⋯,N,求出
S(n,k)=i=0∑2n−1j=0∑2n−1[f(i,j)=k]答案对 109+7 取模。
输入格式
一行两个整数,N 和 k。
输出格式
为了避免输出量过大,我们采用如下方式输出。
设 fn=S(n,k)mod1000000007。
设 gn=nfn,且不取模(C++ 选手可使用 unsigned long long
类型计算并存储)。
你应当输出 gk⊕gk+1⊕gk+2⊕⋯⊕gN,其中 ⊕ 表示按位异或运算。
数据范围与提示
对于 100% 的数据,0≤k≤N≤2×107。
以下记 r=N−k。
子任务编号 |
子任务分值 |
N |
k |
特殊性质 |
子任务依赖 |
1 |
2pts |
≤5 |
r=0 |
无 |
2 |
3pts |
无 |
1 |
3 |
5pts |
≤500 |
r=0 |
4 |
9pts |
无 |
2,3 |
5 |
5pts |
≤2000 |
r=0 |
3 |
6 |
13pts |
无 |
4,5 |
7 |
5pts |
≤100000 |
r=0 |
5 |
8 |
5pts |
r≤10 |
7 |
9 |
7pts |
无 |
6,8 |
10 |
8pts |
≤1000000 |
r=0 |
7 |
11 |
8pts |
r≤10 |
8,10 |
12 |
10pts |
无 |
9,11 |
13 |
5pts |
≤20000000 |
r=0 |
10 |
14 |
15pts |
无 |
12,13 |