输入一个整数
代表排列的长度。
输出一个整数,代表长度为
的双生排列数量对
取模的答案。
3
2
在这个样例中,长度为
的排列有:
![]()
且为双生排列;
![]()
;
![]()
;
![]()
;
![]()
;
![]()
且为双生排列。
package main
import "fmt"
const mod = 1000000007
// CountTwinPermutations 计算长度为n的双生排列数量
// 如果相邻的两项之和为奇数,说明必然是奇数和偶数相隔错开
// 利用排列组合的知识,依次对各个位置出现的可能性进行相乘,就能得到结果
func CountTwinPermutations(n int) int64 {
if n < 2 {
return 0
}
ans := int64(1)
var even, odd int64
if n%2 == 0 {
// 如果n是偶数,那么奇数和偶数一样多
// 可以是 奇数开始,也可以是偶数开始,所以结果要乘 2
even = int64(n / 2)
odd = even
for even > 0 {
ans = (ans * even) % mod
even--
ans = (ans * odd) % mod
odd--
}
ans = (ans * 2)% mod
} else {
// 如果n是偶数,那么奇数必然要比偶数多一个
// 而且必须以奇数开始(不然最后必然是两个偶数相加)
even = int64(n / 2)
odd = int64(n) - even
for even > 0 {
ans = (ans * even) % mod
even--
ans = (ans * odd) % mod
odd--
}
}
return ans
}
func main() {
// 测试用例
var n int
fmt.Scan(&n)
fmt.Println(CountTwinPermutations(n))
}