P2396 yyy loves Maths VII

P2396 yyy loves Maths VII

题目背景

yyy 对某些数字有着情有独钟的喜爱,他叫他们为“幸运数字”;然而他作死太多,所以把自己讨厌的数字称为“厄运数字”。

题目描述

一群同学在和 yyy 玩一个游戏。

每次,他们会给 yyy \(n\) 张卡片,卡片上有数字,所有的数字都是“幸运数字”,我们认为第 \(i\) 张卡片上数字是 \(a_{i}\)

每次 yyy 可以选择向前走 \(a_{i}\) 步并且丢掉第 \(i\) 张卡片。当他手上没有卡片的时候他就赢了。

但是呢,大家对“厄运数字”的位置布置下了陷阱,如果 yyy 停在这个格子上,那么他就输了。注意:即使到了终点,但是这个位置是厄运数字,那么也输了。

现在,有些同学开始问:yyy 有多大的概率会赢呢?

大家觉得这是个好问题,有人立即让 yyy 写个程序:“电脑运行速度很快!\(24\) 的阶乘也不过就 \(620\,448\,401\,733\,239\,439\,360\,000\),yyy 你快写个程序来算一算。”

yyy 表示很无语,他表示他不想算概率,最多算算赢的方案数,而且是对 \(10^9+7\) 取模后的值。

大家都不会写程序,只好妥协。

但是这时候 yyy 为难了,\(24!\) 太大了,要跑好长时间。

他时间严重不够!需要你的帮助!

某个数字可能既属于幸运数字又属于厄运数字。

输入格式

第一行一个整数 \(n\)

下面一行 \(n\) 个整数,第 \(i\) 个整数代表第 \(i\) 张卡片上的数字 \(a_i\)

第三行 \(m\) 表示 yyy 的厄运数字个数(最多 \(2\) 个)。

\(m>0\),第四行 \(m\) 个数 \(b_i\) 代表所有的厄运数字。

输出格式

输出胜利方案数对 \(10^9+7\) 取模的结果。

输入输出样例 #1

输入 #1

8
1 3 1 5 2 2 2 3
0

输出 #1

40320

输入输出样例 #2

输入 #2

24
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2
10 15

输出 #2

0

说明/提示

  • \(10\%\) 的数据 \(n \leq 10\)
  • \(50\%\) 的数据 \(n \leq 23\)
  • \(100\%\) 的数据 \(n \leq 24\)\(0\le m\le 2\)\(1\le a_i,b_i\le 10^9\)

题意概括

给定一个长度为 \(n\) 的序列 \(a\) 和最多两个厄运数字,求所有满足以下条件的排列方案数:对于该排列的任意前缀和(包括总和)均不等于任一厄运数字,结果模 \(10^9+7\)

思路

看到数据范围就应该想到 \(O(n2^n)\) 的做法,而且很卡,对此还应该考虑优化才对

那么首先肯定设 \(f[S]\) 指丢了这些牌的合法方案数,考虑转移

转移肯定是从其中一个子集再多丢一张牌转移到当前状态,那么只要当前状态的距离值合法,那么当前状态一定合法

那么就有转移:

\[f[S]=\sum f[S \oplus j] ,(S\not =b_1,S\not=b_2) \]

那么代码就很好写了

posted @ 2025-07-29 16:31  shencheng4014  阅读(8)  评论(0)    收藏  举报