小R正在研究一种特殊的排列,称为“好排列”。一个排列被称为“好排列”,当且仅当其中所有相邻的两个数的乘积均为偶数。现在给定一个正整数 𝑛n,小R想知道,长度为 𝑛n 的好排列共有多少种。由于结果可能非常大,你需要将结果对 109+7109+7 取模后输出。我们需要计算长度为 n 的好排列的数量。一个排列被称为“好排列”,当且仅当其中所有相邻的两个数的乘积均为偶数。
关键点
-
偶数和奇数的性质:
- 偶数乘以偶数是偶数。
- 偶数乘以奇数是偶数。
- 奇数乘以奇数是奇数。
因此,为了保证相邻的两个数的乘积为偶数,排列中不能有两个相邻的奇数。
-
排列的构造:
- 如果
n是偶数,我们可以将所有偶数放在一起,所有奇数放在一起,然后交替排列。 - 如果
n是奇数,我们可以将所有偶数放在一起,所有奇数放在一起,然后交替排列,但最后一个位置必须是偶数。
- 如果
数据结构和算法
我们可以使用动态规划来解决这个问题。定义 dp[i] 为长度为 i 的好排列的数量。
状态转移
- 如果
i是偶数,dp[i] = dp[i-1] * 2,因为我们可以将最后一个位置放偶数或奇数。 - 如果
i是奇数,dp[i] = dp[i-1] * 2 - 1,因为最后一个位置必须是偶数。
初始条件
dp[1] = 1,因为长度为1的排列只有一种,且是好排列。
代码框架
python
关键点
-
偶数和奇数的性质:
- 偶数乘以偶数是偶数。
- 偶数乘以奇数是偶数。
- 奇数乘以奇数是奇数。
因此,为了保证相邻的两个数的乘积为偶数,排列中不能有两个相邻的奇数。
-
排列的构造:
- 如果
n是偶数,我们可以将所有偶数放在一起,所有奇数放在一起,然后交替排列。 - 如果
n是奇数,我们可以将所有偶数放在一起,所有奇数放在一起,然后交替排列,但最后一个位置必须是偶数。
- 如果
数据结构和算法
我们可以使用动态规划来解决这个问题。定义 dp[i] 为长度为 i 的好排列的数量。
状态转移
- 如果
i是偶数,dp[i] = dp[i-1] * 2,因为我们可以将最后一个位置放偶数或奇数。 - 如果
i是奇数,dp[i] = dp[i-1] * 2 - 1,因为最后一个位置必须是偶数。
初始条件
dp[1] = 1,因为长度为1的排列只有一种,且是好排列。
代码框架
python