有点难想的状态压缩dp
Description
一群同学在和yyy玩一个游戏
每次,他们会给yyy n张卡片,卡片上有数字,所有的数字都是”幸运数字”,我们认为第i张卡片上数字是ai
每次yyy可以选择向前走ai步并且丢掉第i张卡片
当他手上没有卡片的时候他就赢了
但是呢,大家对”厄运数字”的位置布置下了陷阱,如果yyy停在这个格子上,那么他就输了
(注意:即使到了终点,但是这个位置是厄运数字,那么也输了)
现在,有些同学开始问:
yyy有多大的概率会赢呢?
大家觉得这是个好问题
有人立即让yyy写个程序
“电脑运行速度很快!24的阶乘也不过就620448401733239439360000,yyy你快写个程序来算一算”
yyy表示很无语,他表示他不想算概率,最多算算赢的方案数,而且是%1,000,000,007以后的值
大家都不会写程序,只好妥协
但是这时候yyy为难了,24!太大了,要跑好长时间.
他时间严重不够!需要你的帮助!
由于yyy人格分裂,某个数字可能既属于幸运数字又属于厄运数字。
Samples
Input #1
1 | 8 |
Output #1
1 | 40320 |
Input #2
1 | 0 |
Hint
数据范围:
10%的数据n<=10
50%的数据n<=23
100%的数据n<=24
Solution
观察到$n$的范围极小, 那么考虑状压dp.
我们设$dp_i$表示选择了集合$i$内的卡片的方案数, 然后记一个$dist_i$表示使用集合$i$内卡片所到达的位置.
显然在$dist_i$是厄运数字的时候是不能转移的, 那么特判掉.
考虑转移, 我们可以枚举当前使用的卡片$j, j \in i$, 可以得出:
$$dp_i = \sum_{j=1}^n [j \in i] dp_{i \text{ } \rm{xor} \text{ }j}$$
这里的$dp_{i \text{ } \rm{xor} \text{ }j}$是表示集合$i$在删除$j$这个元素时的答案.
Code
1 | /* Headers */ |