题面
内容
给定 n,m,求所有长为 n 的序列 a,满足 0≤ai≤m,i=1∑nai=m 的序列 a 的价值之和,对 109+9 取模的结果。
这里一个序列的价值定义为它所有元素的异或和。
输入
输入一行两个整数 n,m。
输出
输出一行一个整数,表示价值和模 109+9 的结果。
样例1
输入
2 5
输出
22
样例2
输入
3 5
输出
63
样例3
输入
4 18
输出
12712
样例4
输入
90 98
输出
359887814
提示
对于 100% 的数据,满足 2≤n≤103,0≤m≤109。
样例 1 解释:
序列 a 为 (0,5),异或和为 0⊕5=5;
序列 a 为 (1,4),异或和为 1⊕4=5;
序列 a 为 (2,3),异或和为 2⊕3=1;
序列 a 为 (3,2),异或和为 3⊕2=1;
序列 a 为 (4,1),异或和为 4⊕1=5;
序列 a 为 (5,0),异或和为 5⊕0=5;
和为 5+5+1+1+5+5=22。
思路
首先题意是让你找出所有的序列,这个序列满足长度为n序列和等于m,序列中的每个数都满足∈[0,m]的范围,该序列的价值为该序列中所有的数的异或和,答案是所有情况的异或和的求和(mod1e9+9)。
我们可以来看序列中n个数和m的二进制表示,定义fi,j为考虑完前i位,且第i位的和等于m的这一位,下一位进位为j的方案数,gi,j表示考虑完前i位,且第i位的和等于m的这一位,下一位进位位j的所有方案异或和的求和。
因为我们要保证序列和为m,所以我们要保证二进制下每一位加起来都等于m的这一位。
然后我们枚举一个k代表第i位我要在1∼n中填多少个1。
那么fi+1,⌊2j+k⌋=fi,j×C(kn),其中C为组合数,意为原来的方案数,在i这位又产生了C(nk)种可能,由于相互独立性,因此下一位的方案数是它们相乘。
假如k是偶数,那么这一位异或起来一定是0,所以不会产生新的贡献,有的只是新的情况,所以就相当于有若干个gi,j加了起来组成了新的状态,也就是:
gi+1,⌊2j+k⌋=gi,j×C(kn)
假如k是奇数,那么这一位异或起来一定是1,而第i+1位加一,产生的贡献是2i+1,所以会产生情况数×每种情况的贡献,也就是:
gi+1,⌊2j+k⌋=gi,j+2i+1×fi,j×C(kn)
所以最后的答案就是glogm,0。