输入一个整数
代表排列的长度。
输出一个整数,代表长度为
的双生排列数量对
取模的答案。
3
2
在这个样例中,长度为
的排列有:
![]()
且为双生排列;
![]()
;
![]()
;
![]()
;
![]()
;
![]()
且为双生排列。
主要考察防止数值溢出的取模知识,本题为排列知识,例如当n = 4(偶数)时,1,2,3,4。
此时奇偶数相等,数量均为n / 2。第一步可以放奇或偶数。若放奇数,选择有两个(1或3)。
第二个需放偶数,选择有两个(2或4);第三个放奇数,由于前面放了一个奇数,故现在只剩下一个奇数。
把各步能选择的个数相乘即可得到答案。但第一步也可以放偶数,所以答案要×2。
但当n = 3(奇数)时:1、2、3,第一步只能放奇数,否则2,1,3不满足题意。所以最后的答案不需要×2。
过程中需要注意乘数溢出问题,每一次乘法都需要对mod取模。
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int totalNums = in.nextInt();
long mod = 1000000007;
if (totalNums % 2 == 0){
int OuShuEqualsQiShu = totalNums / 2;
long res = 1;
for (int i = 2; i <= OuShuEqualsQiShu; i++){
res = res * i % mod;
}
System.out.println((res * res * 2) % mod);
}else{
int ouShu = totalNums / 2;
long res = 1;
for (int i = 2; i <= ouShu; i++){
res = res * i % mod;
}
System.out.println(((res * res) % mod * (ouShu + 1)) % mod);
}
}
}
}