题面:给定n,m,q,构造一个长度为n的数组,其中数组中的每个元素大小均小于,若该数组的某一个子序列中,所有元素按位与(AND)之后的结果为1,则该数组合法。求有多少种合法数组
例如n=3,m=3,q=100000
[1,0,3]是一个合法数组,因为子序列[1]的AND结果为1
[5,3,0]是一个合法数组,因为子序列[5,3]的AND结果为1
思路:
将原问题看成:
找到子序列中,恰好有i个元素相与为1,多一个都会出错。
一.i个元素相与为1,可以看成如下图:
该位下至少有一个为0 | 该位下至少有一个为0 | 该位下至少有一个为0 | 必须全1 | |
第一个元素的二进制 | 1 | |||
第二个元素的二进制 | 1 | |||
......... | 1 | |||
第i个元素的二进制 | 1 |
那么某位至少有一个0,也就是不能全1,也就是该位可以填的数有个,而总共有(m-1)位这样的位置,总共可以填的数量为
而需要从n个数中挑选i个值出来,还需乘上
二.对于其它的n-i个位置,由于它不能和前面的任意数字AND后为1,仅需令第一位为0即可
任意 | 任意 | 任意 | 必须全0 | |
第一个元素的二进制 | 0 | |||
第二个元素的二进制 | 0 | |||
......... | 0 | |||
第n-i个元素的二进制 | 0 |
也就是每个元素可以任取种值,总共n-i个元素,得到的结果为:
最终得到的结果为: