4054 序列
2023-08-09 20:33:42 # OI # Problem

题面

内容

给定 n,mn, m,求所有长为 nn 的序列 aa,满足 0aim,i=1nai=m0 \le a_i \le m, \sum\limits_{i = 1}^n a_i = m 的序列 aa 的价值之和,对 109+910^9 + 9 取模的结果。

这里一个序列的价值定义为它所有元素的异或和。

输入

输入一行两个整数 n,mn, m

输出

输出一行一个整数,表示价值和模 109+910^9 + 9 的结果。

样例1

输入

2 5

输出

22

样例2

输入

3 5

输出

63

样例3

输入

4 18

输出

12712

样例4

输入

90 98

输出

359887814

提示

对于 100%100 \% 的数据,满足 2n103,0m1092 \le n \le 10^3, 0 \le m \le 10^9

样例 11 解释:

序列 aa(0,5)(0, 5),异或和为 05=50 \oplus 5 = 5

序列 aa(1,4)(1, 4),异或和为 14=51 \oplus 4 = 5

序列 aa(2,3)(2, 3),异或和为 23=12 \oplus 3 = 1

序列 aa(3,2)(3, 2),异或和为 32=13 \oplus 2 = 1

序列 aa(4,1)(4, 1),异或和为 41=54 \oplus 1 = 5

序列 aa(5,0)(5, 0),异或和为 50=55 \oplus 0 = 5

和为 5+5+1+1+5+5=225 + 5 + 1 + 1 + 5 + 5 = 22

思路

首先题意是让你找出所有的序列,这个序列满足长度为nn序列和等于mm,序列中的每个数都满足[0,m]\in{[0,m]}的范围,该序列的价值为该序列中所有的数的异或和,答案是所有情况的异或和的求和(mod1e9+9)\pmod{1e9+9}

我们可以来看序列中nn个数和mm的二进制表示,定义fi,jf_{i,j}为考虑完前ii位,且第ii位的和等于mm的这一位,下一位进位为jj的方案数,gi,jg_{i,j}表示考虑完前ii位,且第ii位的和等于mm的这一位,下一位进位位jj的所有方案异或和的求和。

因为我们要保证序列和为mm,所以我们要保证二进制下每一位加起来都等于mm的这一位。

然后我们枚举一个kk代表第ii位我要在1n1\sim{n}中填多少个1。

那么fi+1,j+k2=fi,j×C(kn)f_{i+1,{\lfloor\frac{j+k}{2}}\rfloor}=f_{i,j}\times{C(^{n}_{k})},其中CC为组合数,意为原来的方案数,在ii这位又产生了C(nk)C(^{n}{k})种可能,由于相互独立性,因此下一位的方案数是它们相乘。

假如kk是偶数,那么这一位异或起来一定是00,所以不会产生新的贡献,有的只是新的情况,所以就相当于有若干个gi,jg_{i,j}加了起来组成了新的状态,也就是:

gi+1,j+k2=gi,j×C(kn)g_{i+1,{\lfloor\frac{j+k}{2}}\rfloor}=g_{i,j}\times{C(^{n}_{k})}

假如kk是奇数,那么这一位异或起来一定是11,而第i+1i+1位加一,产生的贡献是2i+12^{i+1},所以会产生情况数×\times每种情况的贡献,也就是:

gi+1,j+k2=gi,j+2i+1×fi,j×C(kn)g_{i+1,{\lfloor\frac{j+k}{2}\rfloor}}=g_{i,j}+2^{i+1}\times{f_{i,j}}\times{C(^n_k)}

所以最后的答案就是glogm,0g_{logm,0}